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