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
变量。