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。