在JavaScript中使用bind避免闭包是否正确? 闭包对浏览器的内存来说太糟糕了吗 在JavaScript中使用bind避免闭包是一种好方法吗

在JavaScript中使用bind避免闭包是否正确? 闭包对浏览器的内存来说太糟糕了吗 在JavaScript中使用bind避免闭包是一种好方法吗,javascript,Javascript,现行守则: var oControl = new Control({ var self = this; click: function(e){ //closure that's accessing self var self.performAction(); } }); 我被告知要避免编写如上所示的代码。给定原因-在上述代码中创建了一个闭包。有人建议我使用bind来解决上述问题 修改代码: var oControl = new Control({

现行守则:

var oControl = new Control({
    var self = this;
    click: function(e){ //closure that's accessing self var
        self.performAction();
    }
});
我被告知要避免编写如上所示的代码。给定原因-在上述代码中创建了一个闭包。有人建议我使用bind来解决上述问题

修改代码:

var oControl = new Control({
    var self = this;
    click: function(e){ //Not a closure  
        this.performAction(); //Is this more readable?
    }.bind(self)
});
我不太确定修改后的代码是否更具可读性。不知怎的,我觉得这在某种程度上被污染了。也许有更好的方法来避免关闭?但是,首先真的需要避免它们吗?

我建议:

var oControl = new Control({
    click: this.performAction.bind(this)
});
代码中似乎根本没有理由使用
self
变量,如果单击处理程序只是要调用其他方法,那么您也可以使用
.bind()
而不使用包装函数

仅供参考,
.bind()
本身会创建一个闭包,所以不要认为使用
.bind()
就是消除闭包。它使您无需手工编写闭包变量,这使得它使用起来非常方便,并且使您的代码看起来更干净

至于你的其他问题:

  • 闭包对浏览器的内存来说太糟糕了吗
  • 闭包确实会使用一些额外的内存。除非你有无数的记忆,否则这些额外的记忆不太可能是物质的。而且,
    .bind()
    在其实现中也可能使用闭包(该
    指针必须存储在某处)

  • 在JavaScript中使用bind避免闭包是一种好方法吗

  • .bind()
    非常有用,当它满足您的需要时,您可以随意使用它。是将第一个代码块与自己的闭包变量一起使用,还是将第二个代码块与使用
    .bind()
    的包装函数一起使用,还是我的建议,在很大程度上取决于对编码风格和实现清洁度的看法。所有这些都可以正常工作,在性能或内存使用方面不太可能存在有意义的差异。

    您根本不需要
    self
    ——而且您的代码一开始就无效,
    可读性
    是一种观点,jfriend00。接下来的一个问题是:如果我必须在click处理程序中使用local var
    e
    ,那么我想,我必须使用“第二块代码,其中包含使用.bind()的包装函数”?示例:
    click:function(e){e.target.style.visibility='hidden';this.performAction()}.bind(另一个对象)
    看起来有另一个关于bind和closures@AmanK之间性能差异的讨论-是的,如果事件处理程序中除了一个函数调用之外还有其他代码(您在问题中没有显示的内容),那么显然您必须使用外部包装器函数。