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
页面,并查看解释箭头函数的链接:。如果您需要其他资源,请告诉我,我很乐意为您提供帮助!