-
Notifications
You must be signed in to change notification settings - Fork 0
作用域是什么 #4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
理解作用域我们用模拟几个人物对话的形式来学习作用域 演员表
对话解析 var a = 1 的过程
总结变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能找到就会对他赋值 编译器有话说在上述例子中,引擎会对 a 进行 LHS 查询,另外一个查询类型叫做 RHS
可以将 RHS 理解为retrieve his source value(取到他的源值),这意味着 “得到某某的值” 引擎和作用域的对话function foo(a) {
console.log(a);
}
foo(2); 把上面代码想象成一段对话,可能是这样的:
|
作用域嵌套当一个块或函数嵌套在另一个块或函数中时,就发生了作用域嵌套。因此,在当前作用域下无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量为止,或抵达最外层的作用域(全局作用域)为止,当抵达到最外层的全局作用域时,无论找到没找到,查找过程都会停止。 function foo(a) {
console.log(a + b);
}
var b = 1;
foo(2); 对 b 进行 RHS 引用无法在函数 foo 中完成,但可以在上一级作用域中完成
|
异常在变量还有声明的情况下,LHS 和 RHS的查询行为是不一样的 function foo(a) {
console.log(a + b);
}
foo(2); 第一次对 b 进行 RHS 查询时是无法找到该变量的( 当引擎在执行LHS查询的时候,如果在全局作用域中也无法找到目标变量,全局作用域中就会创建一个具有该变量名称的变量,并将其返回给引擎,前提是程序运行在
如果 RHS 查询到一个变量,但是尝试对这个变量进行不合理操作时(比如:试图对一个非函数类型的值进行函数调用),那么引擎就会抛出 |
编译原理
javascript 是一门
编译
语言传统语言编译 3 步骤
分词 / 词法分析
将代码分解成有意义的代码块,这些代码块成为
词法单元 (token)
如果词法单元生成器在判断
a
是提个独立的词法单元还是其他词法单元的一部分时,调用的是有状态的解析规则,这个过程就被称为词法分析
语法分析
将词法单元流(数组)转换成一个由元素逐级嵌套的代表了程序语法结构的树,这个树被称为
抽象语法树(AST)
代码生成
将AST转换为可执行代码的过程
js 引擎的编译过程
比起编译过程只有以上 3 步的编译器,js 引擎要复杂的多。例如,在词法分析与代码生成阶段会对运行性能和冗余元素进行优化等
js 的编译过程不是发生在构建之前的,大部分情况下,编译发生在代码执行前几微妙(甚至更短)的时间内,js 引擎不会有大量的(像其他语言那么多的)时间来进行优化,js 引擎会用尽各种办法(例如可以延迟编译甚至重编译)来保证性能最佳
The text was updated successfully, but these errors were encountered: