首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript作用域链提升

Javascript作用域链提升
EN

Stack Overflow用户
提问于 2013-07-09 05:06:45
回答 1查看 158关注 0票数 0

例如,我有点困惑JavaScript中的词法作用域是如何实现的

代码语言:javascript
复制
function outer(){
    a = 5;
    function inner(){
        console.log(a);
        var a = 10;    //hoisting
    }
    inner();
}
outer();

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

EN

回答 1

Stack Overflow用户

发布于 2013-07-09 05:09:45

在我的记忆中,提升会导致inner函数被解释为:

代码语言:javascript
复制
function inner(){
    var a;
    console.log(a);
    a = 10;
}

因此,当您将a赋值为10时,它将查找作用域,直到找到a的定义为止,该定义位于inner函数内的var语句中。它认为没有必要超出这个范围,所以它的行为就像outer函数中的a不存在一样。此外,在执行var a;时,a在缺省情况下设置为undefined。这就是为什么您会看到undefined作为输出。

我将详细解释一下Javascript解释器遇到函数时会执行以下操作(这称为执行上下文) A-创建阶段1-第一步它创建一个不可访问的对象,称为variable object,它看起来像是外部函数的对象

代码语言:javascript
复制
a: undefined 
inner : pointer to function

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

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

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

代码语言:javascript
复制
    inner : pointer to function

如果您在声明之前调用了inner(),这是可以的,但这不适用于匿名函数

因为它就像对待任何变量一样

代码语言:javascript
复制
fn();
var fn = function () {..}

这不会起作用,因为它的变量对象将是这样的

代码语言:javascript
复制
fn: undefined 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17535996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档