我有这样的事情:
var Something = function(){
this.render = function(){};
$(window).resize(function(){
this.render();
});
}
麻烦的是,在匿名函数里面'this'指的是窗口对象。我知道我可以这样做:
var Something = function(){
this.render = function(){};
var tempThis = this;
$(window).resize(function(){
tempThis.render();
});
}
但有更好的方法吗?这看起来不太优雅。
答案 0 :(得分:14)
您找到的解决方案是大多数人使用的解决方案。常见的惯例是将你的tempThis变量称为“那个。”
var Something = function(){
this.render = function(){};
var that = this;
$(window).resize(function(){
that.render();
});
};
答案 1 :(得分:2)
这看起来是你最好的选择,我不认为有更好的方法。 (如果我错了,有人会纠正我。)
答案 2 :(得分:1)
答案 3 :(得分:0)
在很多紧张的情况下,我一直这样做。它看起来并不优雅,但它永远不会失败。实际上这就是javascript关闭的动作。
JRH
答案 4 :(得分:0)
这正是我所做的。它也不是jQuery特有的。
var Construct = function() {
var self = this; //preserve scope
this.materials = 2000;
this.build = function(){
self.materials -= 100;
};
};
请记住在新范围变量前面使用var关键字。否则,您正在创建一个新的全局变量。作为局部变量,它仍然可以通过闭包在内部函数内部访问。
答案 5 :(得分:0)
将变量保持在最小值的最佳解决方案是使用Function.prototype.bind()方法。
var Something = function(){
this.render = function(){};
$(window).resize( this.render.bind( this ) );
}
这种方法的问题可能导致未来的复杂化,这意味着你应该选择谨慎使用它,就是当你需要调用$(this)
来抓取元素时。因此,我可能会建议在调整大小方法中使用Function.prototype.bind()
是值得的,但在单击函数中使用它并不是一个很好的解决方案,您可能需要直接定位单击的元素。
有关工作示例,请参阅此JSFiddle。
有关详细信息,请参阅Mozilla Documentation on Function.prototype.bind()
其他方法是可用的,但根据您的问题创建一个变量来维护此上下文是不受欢迎的效果。