关于学习Javascript、执行上下文、堆栈、闭包的基本问题



Javascript社区。

Anthony Alicea的课程名为"理解奇怪的部分"(ECMAScript 5(,第2节,视频16:作用域链,我想我发现JS解释器如何使用作用域链执行函数不一致。

我知道Javascript中的一切都发生在它自己的执行上下文中,全局被创建,然后每个函数被创建、执行、放在堆栈上、从堆栈中取出等等。我明白了。

然而,我不理解当一个函数被放在与全局上下文相同级别的执行堆栈上时的作用域链,为什么它不在变量值的全局上下文之外进行作用域,而是将其作为未定义的进行console.log。

请以以下代码为例:

//Following function is created within the global execution context
function a3() {
console.log(myVar3);  //The console.log generates a 'undefined' here, why not a 1? 
function b3(){
console.log(myVar3); //console.log generates a 2, because it follows the scope chain
//and looks outside of its execution context; why does function a3
//not do this with the global context?
}
var myVar3 = 2;
b3();
}
var myVar3 = 1; // Global execution context
a3();           // Global execution context

为什么函数a3中的console.log不查看全局执行上下文并为值打印1?这似乎与a3到b3中函数调用的相同模式不一致。b3函数中的myVar3超出其执行上下文,并找到值2。

请有人解释一下为什么治疗不一致?

在学习ECMAScript的最新功能之前,我正在努力获得一个良好的、基本的理解。请仅在使用"var"关键字而不是最新的"let"或"const"构造时为ECMAScript 5提供注释。

感谢您的回复!

控制台生成一个未定义的,因为变量尚未定义。JavaScript在执行完函数b((之后才会读取变量定义。

最新更新