在Secrets of Javascript Closures中,Stuart Langridge提供了一段代码,用于演示.onclick回调中闭包的常见用法,并解释:
link.onclick = function (e) {
var newa = document.createElement("a");
var that = this;
document.body.appendChild(newa);
newa.onclick = function (e) {
that.firstChild.nodeValue = "reset";
this.parentNode.removeChild(this);
}
}
我最近偶然发现了Kyle Simpsons'演讲者甲板New Rules For Javascript并且他提到,为this
或(如在代码段中)var self = this
这样的封闭保存var that = this
的范围是"错误的"以及Object.prototype.bind()
的案例。 <除了ES5兼容性之外,我觉得更倾向于使用语言结构来解决问题而不是使用黑客或快速修复,但在此代码段中,使用bind
,apply
或call
的问题是需要this
的封闭值的引用和封闭的this
的参考值。
这是一个实用性胜过哲学的案例吗?可以做些什么?
答案 0 :(得分:3)
在一般情况下,如果你确实需要this
和that
,那么你不能只取消其中一个,是吗?
对于单击处理程序,您应该能够通过查看传入的事件对象来获取有问题的元素。我相信它具有某种target
属性。因此,您可以使用e
代替this
,然后将that
绑定为this
。
根据页面的结构方式,您也可以遍历DOM以从this
转到that
,尤其是如果您使用id或class来语义标记内容。 / p>
答案 1 :(得分:1)
我不会认为你的例子是bind
这个错误的案例,而且这是单独的引用。绑定的错误案例是:
var that = this;
var fn = function () {
that.method();
}
return fn;
VS
var fn = function() {
this.method();
}
return fn.bind(this);