Javascript 为什么可以';生活/功能访问“;这";在外部功能中?

Javascript 为什么可以';生活/功能访问“;这";在外部功能中?,javascript,this,iife,Javascript,This,Iife,在下面的代码中 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);
        }());
    }
};
myObject.func();
它在控制台中打印:

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

前两个很明显,但我不明白第三个和第四个,为什么生命可以接近自我,但却无法接近自我?我认为它创建了一个闭包,这样它就可以访问外部变量本身和这个?

我不确定这是否解决了您的问题,但您可以通过将它作为参数传递给IIFE来绑定这个:

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

您可以使用“.call(this)”代替带anon的“()”,但这不是像闭包那样继承的。因为
这是一个计算当前函数上下文的表达式。它不是一个变量,也不是从包含范围继承的。这只是对
这个
如何工作的误解。看这里谢谢各位,我不知道如何给评论投票,这个网站很新。但是他们都很有帮助!一个更好的参考是这个答案(它更好,因为它更完整,并且(由我)定期更新):不妨使用
call/apply
。与
self
相比,这实际上没有任何优势,在本例中,IMOHO。您最好使用#bind,它重新分配
this
变量。