2012-07-20 54 views
13

为什么我们不能在下面的例子中直接使用this而不是self为什么我们需要在Javascript中的类中使用“var self = this”?

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 
} 

后的反应,我已经学会:

是的,有没有必要,如果有类没有上下文切换。

但我会用这种方法作为“约定”,虽然没有必要。

回答

21

没有理由,为什么你不能使用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); 
} 
+0

是否setTimeout的构造函数中运行?或者它是课堂的方法? – ozz 2012-07-20 10:16:12

+0

@ozz:查看['window.setTimeout']的文档(https://developer.mozilla.org/en/DOM/window.setTimeout);它会延迟提供的函数的执行时间,以指定的毫秒数。 – Matt 2012-07-20 10:17:45

+0

更不用说,setTimeout还允许你传递一个参数。即http://jsfiddle.net/gRoberts/rYB3f/,在您的示例中,它将删除将'this'重新声明为'self'的需要。 – Gavin 2012-07-20 10:22:17

3

根据你的例子,“没有”这样做的理由。

然而,有些情况下,它会帮助你,虽然有些人可能会对它的使用感到沮丧。

$('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');     
      } 
     }); 
    } 
}); 
+5

虽然你当然是技术上正确的,但是这样的答案有点麻烦:** jQuery!= javascript **!用jQuery语法回答广泛的javascript问题可能会让初学者感到困惑。 – cypherabe 2012-07-20 10:25:39

+0

然而,您的权利很少,初学者很少学习原生JavaScript,他们倾向于搜索Google解决方案,这在大多数情况下会导致使用jQuery。这是一把双刃剑。如果我已经给出了一个原生的JavaScript示例,那么只知道基于jQuery的JavaScript的人会感到困惑。 – Gavin 2012-07-20 10:28:32

+0

JQuery IS本地JavaScript。尽管这不是本地DOM处理。混淆深刻。 – frostymarvelous 2016-04-26 06:20:07

5

在您的示例代码没有理由在所有this复制到一个变量。

它通常在代码使用回调方法时使用。在回调方法this内部没有引用该对象,因此您使用该变量。

相关问题