【问题标题】:Should I use bind or close an alias in for 'this'? [closed]我应该在“this”中使用绑定还是关闭别名? [关闭]
【发布时间】:2013-10-30 09:51:22
【问题描述】:

我可以创建一个变量或绑定。什么是最好的解决方案?

var object = {
    log: function (s) {
        console.log(s);
    },
    run: function () {
        var self = this;
        setTimeout(
            function () {
                self.log('test');
            }, 1000
        );
    }
};
object.run();

或:

var object = {
    log: function (s) {
        console.log(s);
    },
    run: function () {
        setTimeout(
            function () {
                this.log('test');
            }.bind(this), 1000
        );
    }
};
object.run();

更新: 有很多方法可以决定这一点。兼容性、性能和可读性方面是最重要的。

Function.prototype.bind 函数比较新,使用前请查看兼容性表。

关于性能最好使用 self.多次调用函数时,bind 可能会更好,但这超出了本问题的范围。

我更喜欢 bind 以提高可读性。

【问题讨论】:

  • 你说的最好是什么意思?两种解决方案都有效,并且会产生相同的结果。
  • 难道没有什么可以让一个比另一个更好吗?
  • 再一次,更好是什么意思?可读性?性能?
  • 偏爱其中一个的理由是什么?所有这些原因如何加起来?
  • Function.prototype.bindis not compatible through all browsers。所以这取决于你在乎什么。

标签: javascript coding-style


【解决方案1】:

如果您检查 Function.prototype.bind shim at MDN 的来源,您会注意到它在返回的函数中的多个变量上形成了一个闭包。

鉴于此,您也可以(恕我直言)利用语言功能并关闭您自己需要的变量。您将避免函数调用。

使用.bind当你不控制你正在调用的函数的源并且你需要设置this,或者如果你想提供额外的参数时非常有用.

【讨论】:

    【解决方案2】:

    这里没有真正的“最佳解决方案”;两种选择都有效。我个人喜欢 var self=this;因为代码不那么冗长,通常符合目的。

    但是正如 Dan Lee 所说:Function.prototype.bind is not compatible through all browsers

    也许你可以使用underscore bindjQuery proxy

    【讨论】:

      猜你喜欢
      • 2014-09-12
      • 2011-10-20
      • 2012-06-20
      • 2013-05-23
      • 2013-02-05
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多