pra*_*gun 5 javascript variables scope global interpretation
我正在观看有关 javascript 作用域的视频,该视频说在浏览器解释 java 脚本代码之前,它实际上涉及一个快速编译步骤(可以这么说,不完全是“编译”,因为它不涉及创建中间文件),该步骤注册变量并函数声明在各自的作用域中。所以如果我写:
var a = 3;
function foo(){
var c = 2;
}
Run Code Online (Sandbox Code Playgroud)
在计算上述表达式之前(这意味着忽略 RHS 部分),变量“a”和函数“foo”将在全局范围内注册,在“foo”范围内,变量“c”将被注册。在此编译步骤之后,将评估表达式的值。
但是当我们这样写时会发生什么:
var a = function(){
var c;
}
Run Code Online (Sandbox Code Playgroud)
编译步骤是否只是在全局范围内注册变量“a”并跳过函数声明和变量“c”声明,因为编译步骤应该跳过 RHS 部分并且评估表达式出现在解释器部分中?
其实我后来就明白了。这是起重。提升仅适用于变量和函数声明,不适用于函数表达式。事实证明,函数表达式中的函数及其局部变量唯一被注册的时间是 java 脚本解释器运行时(编译后),因为编译步骤不会打扰它们,因为它们位于 RHS 部分。这确保了在函数表达式的情况下,我们仅在赋值后调用它,并且解释器负责在全局范围内注册函数,将其分配给 LHS 变量并声明其局部变量 (var bar;):
var foo = function() {
console.log(bar);
var bar = 5;
};
foo();Run Code Online (Sandbox Code Playgroud)
仅当解释器到达此行时才会创建此函数对象:
var foo = function abc() {
Run Code Online (Sandbox Code Playgroud)
如果这是函数声明的情况,如下所示:
var foo = function abc() {
Run Code Online (Sandbox Code Playgroud)
提升将确保在编译步骤中注册函数“foo”并在其范围内声明变量“bar”。
尽管如此,两个程序都会给出相同的输出——“undeifned”。
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |