Javascript 链式起重机

Javascript 链式起重机,javascript,lexical-scope,hoisting,Javascript,Lexical Scope,Hoisting,例如,我有点搞不清楚JavaScript是如何进行词法范围界定的 function outer(){ a = 5; function inner(){ console.log(a); var a = 10; //hoisting } inner(); } outer(); 如果我们在第5行中重新定义a,那么它将打印未定义的。为什么呢?为什么解释器不遍历并检查outer.VO,即使a可以在internal.VO中找到,但它在定

例如,我有点搞不清楚JavaScript是如何进行词法范围界定的

function outer(){
    a = 5;
    function inner(){
        console.log(a);
        var a = 10;    //hoisting
    }
    inner();
}
outer();

如果我们在第5行中重新定义
a
,那么它将打印
未定义的
。为什么呢?为什么解释器不遍历并检查
outer.VO
,即使
a
可以在
internal.VO
中找到,但它在定义之前就被使用了?

据我所知,提升导致
internal
函数被解释为:

function inner(){
    var a;
    console.log(a);
    a = 10;
}
因此,当您将
a
赋值为10时,它会查找范围,直到找到
a
的定义,该定义位于
内部
函数中的
var
语句中。它认为没有必要超出这个范围,因此它的行为就像
outer
函数中的
a
不存在一样。此外,当
var a时时,
a
默认设置为
undefined
。这就是为什么输出中会出现
未定义的

我会解释得更广泛一些 Javascript解释器在遇到函数时会执行以下操作(这称为执行上下文) A-创作阶段 1-第一步,它生成一个不可访问的对象,称为variable object,它看起来与外部函数类似

a: undefined 
inner : pointer to function
2-它定义了函数的范围链和“this”的值

B-代码执行阶段 它逐行执行代码

如果它遇到一个尚未声明的函数调用,它将执行它

    inner : pointer to function
如果在声明之前调用了internal(),这没关系,但这不适用于匿名函数

就像对待任何变量一样

fn();
var fn = function () {..}
这不起作用,因为它的变量对象是这样的

fn: undefined 

根据我的记忆,提升会导致
内部
功能被解释为:

function inner(){
    var a;
    console.log(a);
    a = 10;
}
因此,当您将
a
赋值为10时,它会查找范围,直到找到
a
的定义,该定义位于
内部
函数中的
var
语句中。它认为没有必要超出这个范围,因此它的行为就像
outer
函数中的
a
不存在一样。此外,当
var a时时,
a
默认设置为
undefined
。这就是为什么输出中会出现
未定义的

我会解释得更广泛一些 Javascript解释器在遇到函数时会执行以下操作(这称为执行上下文) A-创作阶段 1-第一步,它生成一个不可访问的对象,称为variable object,它看起来与外部函数类似

a: undefined 
inner : pointer to function
2-它定义了函数的范围链和“this”的值

B-代码执行阶段 它逐行执行代码

如果它遇到一个尚未声明的函数调用,它将执行它

    inner : pointer to function
如果在声明之前调用了internal(),这没关系,但这不适用于匿名函数

就像对待任何变量一样

fn();
var fn = function () {..}
这不起作用,因为它的变量对象是这样的

fn: undefined 

变量位于顶部,因此您的代码实际上是函数inner(){var a;console.log(a);a=10;},因为这正是提升的意思:它不会进一步遍历作用域链,因为标识符已经在
inner
的作用域中找到了,并解析为内部
a
变量,即使该变量尚未初始化。vars位于顶部,因此您的代码实际上是函数inner(){var a;console.log(a);a=10;},因为这正是提升的意思:它不会进一步遍历范围链,因为标识符已在
内部
的范围中找到,并解析为内部
变量,即使该变量尚未初始化。