为什么在这种情况下内部函数无法访问外部变量?

时间:2016-06-20 18:30:32

标签: javascript scope

根据此代码:

class Thing {
    constructor() {
        this.bar = (typeof foo !== "undefined"? foo : null); // (3)
    }

    static create() {
        var foo = arguments[0];
        return new Thing();
    }
}

新的Thing可能会以两种方式创建:直接使用new ThingThing.create()

以第二种方式创建时,会声明一个新变量string。从理论上讲,它应该在return语句的所有范围内都可见,但在Thing.constructor()(在Thing.create()内调用)中,string未被显示。 Thing.prototype.bar始终为null

为什么会这样?

从<{1}}函数中可以看到

inner()

2 个答案:

答案 0 :(得分:2)

  

理论上,它应该在return语句

之内的所有范围内可见

没有

在同一范围内调用的任何函数都不会显示它。我将在同一范围内的任何创建函数中可见。

在此示例中,constructor()函数的范围高于string变量。

这样可行:

class Thing {
    constructor(prop) {
        this.prop = prop;
    }

    static create() {
        return new Thing(arguments[0]);
    }
}
顺便说一下,这只不过是语法糖:

function Thing(prop) {
    this.prop = prop;
}
Thing.create = function () {
    return new Thing(arguments[0]);
};

答案 1 :(得分:2)

您期望发生的事情(从调用它们的函数继承变量绑定的函数)称为动态变量范围。另一方面,Javascript具有静态(也称为 lexical )变量范围,这意味着变量绑定完全基于在源中彼此嵌套的函数码。这是一件好事,因为这意味着您无需考虑如何调用函数来确定其变量的含义。您只需要查看函数的编写方式。

有关词汇和动态范围之间差异的更多信息,维基百科文章似乎是一个很好的起点:https://en.wikipedia.org/wiki/Scope_%28computer_science%29#Lexical_scoping