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

关于学习Javascript、执行上下文、堆栈和闭包的基本问题,javascript,scope,closures,executioncontext,Javascript,Scope,Closures,Executioncontext,Javascript社区 Anthony Alicea的课程“理解奇怪的部分”(ECMAScript 5),第2节,视频16:作用域链,我想我发现JS解释器使用作用域链执行函数的方式不一致 我知道Javascript中的一切都发生在它自己的执行上下文中,创建全局,然后创建并执行每个函数,放在堆栈上,从堆栈上取下,等等。。我明白了 但是,我不理解当函数与全局上下文放在同一级别的执行堆栈上时的作用域链,为什么它不在变量值的全局上下文之外作用域,而将其作为未定义的console.log记录 请以以下代

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'关键字时提供ECMAScript 5的注释,而不是最新的'let'或'const'构造


感谢您的回复

变量和上下文。在a3内部,全局myVar3处于阴影状态。由于吊装原因,顶部未定义局部myVar3。它在调用b3之前初始化,因此在调用b3时具有本地值。这里没有不一致的地方。它在b3中可用,因为第一个附件是a3创建的。查找将在上下文中“向上”进行,直到找到引用。谢谢Dave Newton