根据此代码:
class Thing {
constructor() {
this.bar = (typeof foo !== "undefined"? foo : null); // (3)
}
static create() {
var foo = arguments[0];
return new Thing();
}
}
新的Thing
可能会以两种方式创建:直接使用new Thing
或Thing.create()
。
以第二种方式创建时,会声明一个新变量string
。从理论上讲,它应该在return
语句的所有范围内都可见,但在Thing.constructor()
(在Thing.create()
内调用)中,string
未被显示。 Thing.prototype.bar
始终为null
。
为什么会这样?
从<{1}}函数中可以看到
inner()
答案 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