【问题标题】:Why can't IIFE/function access "this" in outer function? [duplicate]为什么 IIFE/函数不能在外部函数中访问“this”? [复制]
【发布时间】:2014-11-07 20:12:35
【问题描述】:

在下面的代码中,

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 可以访问 self 而没有访问 this ?我认为它创建了一个闭包,因此它可以访问外部变量 self 和 this ?

【问题讨论】:

  • 你可以使用 ".call(this)" 而不是 "()" 和 anon,但是 this 不像闭包那样被继承。
  • 因为this 是一个计算出当前函数上下文的表达式。它不是一个变量,它不是继承自一个包含范围。
  • 这只是对this 工作原理的误解。见这里stackoverflow.com/questions/3127429/javascript-this-keyword
  • 谢谢大家,我不知道如何给 cmets 投票,对这个网站还很陌生。但他们都非常有帮助!
  • 更好的参考是这个答案(它更好,因为它更完整并且定期更新(由我)):stackoverflow.com/questions/13441307/…

标签: javascript this iife


【解决方案1】:

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

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

Fiddle

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多