6

Javascript 闭包的秘密 中,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 的 Speaker Deck New Rules For Javascript并且他提到this为类似var self = thisor的闭包保存范围var that = this是“被误导的”并且是Object.prototype.bind(). < 除了 ES5 兼容性之外,我更愿意依靠语言结构来解决问题,而不是使用 hack 或快速修复,但在这段代码片段中,使用bind, applyor的问题call是对封闭值this的引用和闭包的引用的值this是需要的。

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

4

2 回答 2

3

在一般情况下,如果您确实需要两者thisthat那么您不能只取消两者之一,可以吗?

在单击处理程序的情况下,您应该能够通过查看传入的事件对象来访问相关元素。我相信它具有某种target属性。因此,您可以使用e而不是this然后绑定以获取thatas this

根据您的页面结构,您还可以遍历 DOM 以获取 from thisto that,特别是如果您使用 id 或 class 对事物进行语义标记。

于 2013-07-30T03:53:40.277 回答
1

我不会认为你的例子是一个错误的案例,bind这都是单独的参考。bind 的错误案例是:

var that = this;

var fn = function () {
    that.method();
}

return fn;

对比

var fn = function() {
    this.method();
} 

return fn.bind(this);
于 2013-07-30T04:00:11.103 回答