在JavaScript中使用作为回调的内部函数(例如AJAX调用)时,它们在自己的环境中运行(this
是窗口对象),并且不知道它们在哪里this
书面。我已经看到了两个解决方案:
self
或that
:(通过自动装箱self
变量完成)var Obj = function(){
var a = 1;
var subFunc = function(){
var self = this;
$.ajax({
url: 'something.x',
success: function(data){alert(self);}
});
}
return {
subtract : subFunc
}
};
var o = new Obj();
o.substract();
bind
命令:(我不确定这是怎么做的)var Obj = function(){
var a = 1;
var subFunc = function(){
$.ajax({
url: 'something.x',
success: function(data){alert(this);}.bind(this)
});
}
return {
subtract : subFunc
}
};
var o = new Obj();
o.substract();
口译员实际开始解释时有什么区别?这会对绩效产生什么影响?
答案 0 :(得分:3)
bind(至少在我工作的地方)。
首先,JavaScript范围很难理解,因为在定义新函数时,“this”不包含在闭包中。它可能会让你想放弃并只是创建一个新的局部变量来指向它,但如果你这样做,你就会限制自己。
一旦你习惯了,bind的优点就是你一直在使用这种语言。
你在JS写了很多课吗?一旦习惯了绑定,就会知道为什么在对象上调用函数不同于将该函数设置为局部变量然后调用它,因为你总是考虑范围。你总是知道“this”来自哪里,因为你声明了它。
你也避免了宣布和阅读,重复“自我”和“那个”变量使代码库混乱的烦恼。
绑定的缺点是它通常不可用。但是为它编写一个polyfill(或者只是在网上找到一个)是非常有教育意义的,然后你再也不用担心它了!
我怀疑这两种方式都存在性能影响。当然不是典型的日常使用。
答案 1 :(得分:1)
最近,一位朋友向我指出了使用var self
与.bind()
的一个好处。
对于Exe:
function () {
var self = this;
$('selector').map(function () {
this.attr('href');
self.doThis();
});
}
这样您就可以使用两个this
范围。我同意另一个答案,它可能会混乱,但我认为它有它的位置。
继承人benchmark 几乎没有差别。然后,这是一个非常简单的测试。
答案 2 :(得分:0)
如果您最终没有使用绑定,我建议您使用that
而不是self
。
那是因为self
是一个有效的全局变量(在window.self
中)。
我曾经命名我的范围self
,有一天我忘记了var self = this
行...这并不像你想象的那样容易调试。我现在使用that
或me
,或者经常使用绑定。