Javascript 为什么在这种情况下,内部函数无法访问外部变量?
根据这一准则:Javascript 为什么在这种情况下,内部函数无法访问外部变量?,javascript,scope,Javascript,Scope,根据这一准则: 类的东西{ 构造函数(){ this.bar=(typeof foo!=“未定义”?foo:null);/(3) } 静态创建(){ var foo=参数[0]; 返回新事物(); } } 新的东西可以通过两种方式创建:直接使用新东西或使用东西.create() 以第二种方式创建时,将声明一个新变量string。从理论上讲,它应该在return语句的所有范围内都可见,但在Thing.constructor()(在Thing.create()中调用)中看不到字符串。而Thing.
类的东西{
构造函数(){
this.bar=(typeof foo!=“未定义”?foo:null);/(3)
}
静态创建(){
var foo=参数[0];
返回新事物();
}
}
新的东西
可以通过两种方式创建:直接使用新东西
或使用东西.create()
以第二种方式创建时,将声明一个新变量string
。从理论上讲,它应该在return
语句的所有范围内都可见,但在Thing.constructor()
(在Thing.create()
中调用)中看不到字符串。而Thing.prototype.bar
总是null
为什么会这样
这里可以从internal()
函数中看到:
(function outer() {
var foo = 5;
(function inner() {
alert(foo);
})()
})();
从理论上讲,它应该在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]);
};
从理论上讲,它应该在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]);
};
您期望发生的事情(从调用它们的函数继承变量绑定的函数)称为动态变量范围。另一方面,Javascript具有静态(也称为词法)变量范围,这意味着变量绑定完全基于源代码中相互嵌套的函数。这是一件好事,因为这意味着您不需要考虑如何调用函数来找出它们的变量的含义。您只需要看看函数是如何编写的
要了解词法范围和动态范围之间的更多区别,wikipedia文章似乎是一个很好的起点:您期望发生的事情(从调用它们的函数继承变量绑定的函数)称为动态变量范围。另一方面,Javascript具有静态(也称为词法)变量范围,这意味着变量绑定完全基于源代码中相互嵌套的函数。这是一件好事,因为这意味着您不需要考虑如何调用函数来找出它们的变量的含义。您只需要看看函数是如何编写的
要了解词法范围和动态范围之间的更多区别,维基百科的文章似乎是一个很好的起点:javascript在使用严格的模式之外将执行一个称为,但是希望通过阅读有关闭包和提升的内容可以解释为什么调用create()
时构造函数中不存在var foo
,哎呀,对不起,你完全正确,我想使用一个变量而不声明它,但我没有说任何关于更改函数的内容,只是闭包在函数中是不同的,这解释了为什么在构造函数中无法访问foo。另外,在第二个示例中,create
可能应该附加到函数Thing
本身,而不是Thing
的原型。我想这就是大多数人认为静态函数工作的方式。@noppa正确,这就是我的意思。感谢您的关注。use strict
模式之外的javascript将执行一个称为的范围查找——也许OP会感到困惑,但希望阅读有关闭包和提升的内容能够解释为什么var foo
在调用create()
whoops时构造函数中不存在,我想在不声明变量的情况下使用变量,但我没有说任何关于更改函数的内容,只是函数中的闭包不同,这解释了为什么在第二个示例中,构造函数中不能访问foo,create
可能应该附加到函数Thing
本身,而不是Thing
的原型。我想这就是大多数人认为静态函数工作的方式。@noppa正确,这就是我的意思。谢谢你的关注。