在标题为“Faces of”的部分中阅读编写一致、惯用的 JavaScript 的原则,this它表明thisJavaScript 中的别名“非常容易出错”。
我个人尽可能尝试使用_.bind()(或类似的东西),但有谁知道为什么别名this如此容易出错?
在标题为“Faces of”的部分中阅读编写一致、惯用的 JavaScript 的原则,this它表明thisJavaScript 中的别名“非常容易出错”。
我个人尽可能尝试使用_.bind()(或类似的东西),但有谁知道为什么别名this如此容易出错?
有四种含义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使用自己的欺骗对象进行交换。
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 调用中单击的这个元素),您必须以某种方式保留对它的引用。我已经在代码中标记了这一点。