【问题标题】:Javascript bind syntaxJavascript 绑定语法
【发布时间】:2016-07-10 01:15:03
【问题描述】:

我正在阅读我的前同事编写的一些节点代码。我不是一个熟练的 javascript 程序员,但我看到很多代码在我看来就像语法糖。例如:

_.bind(this._work, this),

这和调用不完全一样

this._work

【问题讨论】:

  • bindextend 是流行的下划线方法(下划线是一个 js 库)。详情见.bind.extend
  • 我知道。我在问上面的代码行是否需要它们?
  • 是否需要 .bind() 取决于上下文,您还没有显示上下文。调用 .bind 而不使用其返回值不会调用您的 .work() 函数。如果返回值作为回调传递给其他函数,那么您很可能确实需要.bind()。
  • 同意上下文对bind 很重要。另外,就_.extend 而言,我认为您不需要分配部分。 extend 修改现有对象,因此您只需要_.extend(WorkerQueue.prototype, { ... })。是的,您确实想使用extend,这样您就可以扩展对象,而不是用新的分配来清除它。
  • 每个帖子只问一个问题。你的第二个是stackoverflow.com/questions/17474390/… 的副本,顺便说一句。

标签: javascript node.js underscore.js syntactic-sugar


【解决方案1】:

这会创建一个函数的副本,其中this 绑定到正确的对象。这在您传递函数时很有用。

function log(msg) {
  document.querySelector('pre').innerText += msg + '\n';
}

var _ = {
  bind: function(f, self) {
    // Simplified bind implementation
    return f.bind(self);
  }
};

function runFunc(f) {
  f();
}

var obj = {
  myName: 'Mike',
  printName: function() {
    log(this.myName);
  }
};

obj.printName(); // "Mike"
runFunc(obj.printName); // undefined
runFunc(_.bind(obj.printName, obj)); // "Mike"
<pre></pre>

【讨论】:

    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多