为什么我们不能直接使用this
,而不是self
在下面的例子吗?
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
之后的反应,我已经学会:
是的,有没有必要,如果有类没有上下文切换。
但我会用这种方法,因为“公约”,虽然没有必要。
为什么我们不能直接使用this
,而不是self
在下面的例子吗?
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
}
之后的反应,我已经学会:
是的,有没有必要,如果有类没有上下文切换。
但我会用这种方法,因为“公约”,虽然没有必要。
没有理由为什么你不能使用this
直接在那里(我想说,如果你这样做是会为可读性更好)。
然而, var self = this;
往往需要在类似的情况下(基本上,像事件的任何异步操作结合,AJAX等处理,其中的分辨率this
被推迟,直到它等于别的东西);
function SeatReservation(name, initialMeal) {
var self = this;
self.name = name;
self.meal = ko.observable(initialMeal);
setTimeout(function () {
alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance.
}, 100);
}
它通常是为了保持一个参考这个当上下文正在改变完成。 它通常在事件处理程序或回调函数使用。 但正如前面提到的,没有理由在你的具体的例子来使用它。
你会发现下面的文章中更多的细节: http://www.alistapart.com/articles/getoutbindingsituations
在您的示例代码没有理由在所有复制this
一个变量。
当代码使用的回调方法它通常使用。 里面的回调方法this
不引用对象,所以你使用变量为。
根据你的榜样,有“不”的理由这样做。
然而有,情况下它会帮助你,虽然有些人可能对它的使用皱眉。
即
$('a.go').click(function(e)
{
e.preventDefault();
if(!$(this).hasClass('busy'))
{
$(this).addClass('busy');
$.ajax(
{
success : function(resp)
{
$(this).removeClass('busy');
},
error : function()
{
$(this).removeClass('busy');
}
});
}
});
在上面的, $(this)
的成功和错误回调之内不会反映到您单击的链接,范围已丢失。
为了解决这个问题,你会做var self = $(this)
即
$('a.go').click(function(e)
{
e.preventDefault();
if(!$(this).hasClass('busy'))
{
$(this).addClass('busy');
var btn = $(this);
$.ajax(
{
success : function(resp)
{
btn.removeClass('busy');
},
error : function()
{
btn.removeClass('busy');
}
});
}
});