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

Javascript 在Java脚本中注册变量和函数声明,javascript,variables,scope,global,interpretation,Javascript,Variables,Scope,Global,Interpretation,我在看一个关于javascript作用域的视频,视频中说,就在浏览器解释java脚本代码之前,它实际上涉及到一个快速编译步骤(可以说,这并不完全是“编译”,因为它不涉及生成一个中间文件),它在各自的作用域中注册变量和函数声明。 所以如果我写: var a = 3; function foo(){ var c = 2; } 在计算上述表示忽略R.H.S.部分的表达式之前,将在全局范围内注册变量“a”和函数“foo”,并在“foo”范围内注册变量“c”。 在此编译步骤之后,将对表达式的值进行求值

我在看一个关于javascript作用域的视频,视频中说,就在浏览器解释java脚本代码之前,它实际上涉及到一个快速编译步骤(可以说,这并不完全是“编译”,因为它不涉及生成一个中间文件),它在各自的作用域中注册变量和函数声明。 所以如果我写:

var a = 3;
function foo(){
var c = 2;
}
在计算上述表示忽略R.H.S.部分的表达式之前,将在全局范围内注册变量“a”和函数“foo”,并在“foo”范围内注册变量“c”。 在此编译步骤之后,将对表达式的值进行求值

但当我们写下:

var a = function(){
var c;
}

编译步骤是否只在全局范围内注册变量“a”并跳过函数声明和变量“c”声明,因为编译步骤应该跳过R.H.S.部分,而求值表达式在解释器部分?

事实上,我后来才明白。它正在提升。提升仅适用于变量和函数声明,不适用于函数表达式。 事实证明,函数表达式中的函数及其局部变量注册的唯一时间是java脚本解释器运行时(编译后),因为编译步骤不会对它们产生影响,因为它们位于R.H.S部分。这确保在函数表达式的情况下,我们仅在赋值后调用它,解释器负责在全局范围内注册函数,将其赋值给L.H.S.变量并声明其局部变量(var bar;):

var foo=function(){
控制台日志(bar);
var-bar=5;
};

foo()a仍然是一个全局函数,该函数是匿名函数表达式,将在其所在位置进行计算,它不会像命名/声明的函数那样被提升,c仍然注册为函数作用域的本地。