在 Java 脚本中注册变量和函数声明

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 部分并且评估表达式出现在解释器部分中?

pra*_*gun 0

其实我后来就明白了。这是起重。提升仅适用于变量和函数声明,不适用于函数表达式。事实证明,函数表达式中的函数及其局部变量唯一被注册的时间是 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”。