如何使用Object.prototype.bind()重新实现'var that = this'来保存范围引用?

时间:2013-07-30 03:44:39

标签: javascript

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兼容性之外,我觉得更倾向于使用语言结构来解决问题而不是使用黑客或快速修复,但在此代码段中,使用bindapplycall的问题是需要this的封闭值的引用和封闭的this的参考值。

这是一个实用性胜过哲学的案例吗?可以做些什么?

2 个答案:

答案 0 :(得分:3)

在一般情况下,如果你确实需要thisthat,那么你不能只取消其中一个,是吗?

对于单击处理程序,您应该能够通过查看传入的事件对象来获取有问题的元素。我相信它具有某种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);