5

在标题为“Faces of”的部分中阅读编写一致、惯用的 JavaScript 的原则,this它表明thisJavaScript 中的别名“非常容易出错”。

我个人尽可能尝试使用_.bind()(或类似的东西),但有谁知道为什么别名this如此容易出错?

4

2 回答 2

7

有四种含义this取决于它是如何被调用的。因此,必须注意跟踪this正在使用哪个,我可以认为this其中至少有 3/4 容易出现问题。

作为方法调用

obj.myFunc()中,this绑定到obj

如果在回调中传递这个可能会很可怕myFunc,因为它会忘记它曾经是对象的一部分并被独立调用。参见例如'var that = this;' 是什么意思 在 JavaScript 中是什么意思?对于通常的解决方法。

作为独立函数调用

在 plainmyFunc()中,this绑定到全局对象。

作为构造函数调用

调用为new myFunc()(非常不同!所有要调用的函数都new应该大写,因此看起来像一个伪类)。创建一个新对象,将其绑定到this并(可能)返回该对象。

当然,如果你放弃new你将绑定到全局对象,这可能会破坏很多东西并使你的程序处于非常破碎的状态。大小写约定非常重要,让 JSLint (IIRC) 解决了这个问题。

通过应用(或调用)调用

调用为myFunc.apply(obj, args),其中this绑定到obj。请注意,这甚至具有安全隐患,因为任何调用者都可以this使用自己的欺骗对象进行交换。

于 2013-03-06T18:14:26.513 回答
4

this到处都是别名很容易出错,因为(对于开发人员)很难准确记住this在给定情况下所指的内容。这很容易导致开发人员this认为它指的是一个元素,而实际上它是完全不同的东西。例如:

$('#something').click ( function (e) {
    //this refers to the clicked element
    var _this = this;  //Tracking a reference to the clicked element `this`
    $.each(someArray, function(index, value) {
       //this refers to the current element being iterated in someArray
       $.ajax({
          url : 'some/path',
          success: function (res) {
             //this refers to the ajax request
             //_this still references the clicked element
          } 
       })
    })
})

此外,如果您需要this从另一个范围内访问一个this(例如,从 ajax 调用中单击的这个元素),您必须以某种方式保留对它的引用。我已经在代码中标记了这一点。

于 2013-03-06T18:13:00.353 回答