为什么我们不能在下面的例子中直接使用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');
}
});
}
});