【问题标题】:Javascript scope chain hoistingJavascript范围链式提升
【发布时间】:2013-07-08 21:06:45
【问题描述】:

例如,我对如何在 JavaScript 中完成词法作用域感到困惑

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

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

【问题讨论】:

  • vars 到顶部,所以你的代码真的是 function inner(){ var a;控制台.log(a); a=10; }
  • 因为这正是提升的意思:它不会进一步遍历作用域链,因为标识符已经在inner的作用域中找到,并解析到内部a 变量,即使尚未初始化。

标签: javascript lexical-scope hoisting


【解决方案1】:

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

function inner(){
    var a;
    console.log(a);
    a = 10;
}

因此,当您将 a 分配给 10 时,它会查找作用域,直到找到 a 的定义,它位于 inner 函数内的 var 语句中。它认为没有必要超出此范围,因此它的行为就像 outer 函数中的 a 不存在一样。另外,当var a;被执行时,a默认设置为undefined。这就是为什么您会看到 undefined 的输出。

我将对此进行更广泛的解释 Javascript 解释器在遇到函数时会执行以下操作(这称为执行上下文) A- 创作阶段 1- 第一步,它创建了一个不可访问的对象,称为变量对象,它看起来像你的外部函数

a: undefined 
inner : pointer to function

2- 定义函数的作用域链和'this'的值

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

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

    inner : pointer to function

如果你在声明之前调用了inner(),没关系,但对匿名函数不起作用

因为它被视为任何变量

fn();
var fn = function () {..}

这行不通,因为它的变量对象会是这样的

fn: undefined 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多