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.log("inner f
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);
}());
}
};
myObject.func();
这种方法产生相同的结果
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);
return function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
};
}
};
myObject.func()();
//输出
outer func: this.foo = bar
outer func: self.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
这只是JavaScript(特别是ECMAScript 5)的一个核心概念。匿名函数,特别是在闭包中,不保留上下文 您可以这样做:
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}).call(this);
那是因为你实际上是在调用这个函数。如果传入回调,则可以使用
如果使用的是ECMAScript 6,则可以使用箭头函数保留匿名回调的上下文:
(() => {
// `this` retains the context of its parent context
});
这只是JavaScript(特别是ECMAScript 5)的一个核心概念。匿名函数,特别是在闭包中,不保留上下文 您可以这样做:
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}).call(this);
那是因为你实际上是在调用这个函数。如果传入回调,则可以使用
如果使用的是ECMAScript 6,则可以使用箭头函数保留匿名回调的上下文:
(() => {
// `this` retains the context of its parent context
});
根据@Josh Beam的回答,似乎不仅仅是“这个”。根据@Josh Beam的回答,似乎不仅仅是“这个”。谢谢Josh。在对这个概念进行了一番尝试之后,我现在明白了。你有没有参考资料可以让我更深入地了解这件事。@alknows没问题,很高兴它很有帮助:)这是我很久以前读过的一篇文章,我认为它有一些不错的内容:。另外,我建议您完整阅读我在答案中链接的
Function.prototype.bind
页面,并查看解释箭头函数的链接:。如果您需要其他资源,请告诉我,我很乐意为您提供帮助!谢谢你,乔希。在对这个概念进行了一番尝试之后,我现在明白了。你有没有参考资料可以让我更深入地了解这件事。@alknows没问题,很高兴它很有帮助:)这是我很久以前读过的一篇文章,我认为它有一些不错的内容:。另外,我建议您完整阅读我在答案中链接的Function.prototype.bind
页面,并查看解释箭头函数的链接:。如果您需要其他资源,请告诉我,我很乐意为您提供帮助!