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正确,这就是我的意思。谢谢你的关注。