Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生活怎么会';这个变量是指全局范围吗?_Javascript - Fatal编程技术网

Javascript 生活怎么会';这个变量是指全局范围吗?

Javascript 生活怎么会';这个变量是指全局范围吗?,javascript,Javascript,我有以下代码: var myObject = { foo: "bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); console.log("outer func: self.foo = " + self.foo); (function() { console

我有以下代码:

var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }());
    }
};
这将产生:

outer func:  this.foo = bar
outer func:  self.foo = bar
inner func:  this.foo = undefined
inner func:  self.foo = bar

我理解这种情况的发生是因为IIFE的
this
指的是全局范围,而不是
myObject
。但为什么它指的是全球范围?为什么IIFE的
这个
变量引用全局范围?

Javascript中的任何函数调用都会根据函数调用的方式重置
这个
的值。IIFE就是这样一个函数调用

因此,如果您没有以任何特殊方式调用该函数,
this
的值将在浏览器的常规模式下设置为
window
,或在严格模式下设置为
undefined
。这就是Javascript在进行正常函数调用时如何处理此

令许多人惊讶的是,在Javascript中调用函数时,没有“保留”this
的当前值的概念。如果你想控制它,你必须用一种特殊的方法来设置
this
的值

在您的代码中,您可以使用
.call()
来保存
this
的值,如下所示:

var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }).call(this);
    }
};
工作演示:


有关设置
的所有方法的摘要,请参阅。

Javascript中的任何函数调用都会根据调用函数的方式重置
的值。IIFE就是这样一个函数调用

因此,如果您没有以任何特殊方式调用该函数,
this
的值将在浏览器的常规模式下设置为
window
,或在严格模式下设置为
undefined
。这就是Javascript在进行正常函数调用时如何处理此

令许多人惊讶的是,在Javascript中调用函数时,没有“保留”this
的当前值的概念。如果你想控制它,你必须用一种特殊的方法来设置
this
的值

在您的代码中,您可以使用
.call()
来保存
this
的值,如下所示:

var myObject = {
    foo: "bar",
    func: function() {
        var self = this;
        console.log("outer func:  this.foo = " + this.foo);
        console.log("outer func:  self.foo = " + self.foo);
        (function() {
            console.log("inner func:  this.foo = " + this.foo);
            console.log("inner func:  self.foo = " + self.foo);
        }).call(this);
    }
};
工作演示:


有关设置此的所有方法的摘要,请参阅。

,因为JS函数就是这样工作的。如果不隐式(通过
对象.method()
语法)或显式(通过
.call
.apply
.bind
)设置
this
的值,则默认为全局对象,除非处于严格模式

因此,如果您接受一个生命,并使用
.call
,将另一个对象传递给它,您将得到该对象作为
this

    (function() {
        console.log("inner func:  this.foo = " + this.foo); // "bar"
        console.log("inner func:  self.foo = " + self.foo);
    }).call({foo: "bar"});

因为JS函数就是这样工作的。如果不隐式(通过
对象.method()
语法)或显式(通过
.call
.apply
.bind
)设置
this
的值,则默认为全局对象,除非处于严格模式

因此,如果您接受一个生命,并使用
.call
,将另一个对象传递给它,您将得到该对象作为
this

    (function() {
        console.log("inner func:  this.foo = " + this.foo); // "bar"
        console.log("inner func:  self.foo = " + self.foo);
    }).call({foo: "bar"});

Douglas Crockford的Javascript:好的部分对我理解JS的函数范围怪癖有很大帮助。Douglas Crockford的Javascript:好的部分对我理解JS的函数范围怪癖有很大的帮助。有一个很好的解释。添加了演示使用
.call(this)
的JSFIDLE。添加了演示使用
.call(this)
的JSFIDLE。