2015-03-18 49 views
7

我遇到有这种模式在许多地方的一些代码:this.someFunction.call的用途是什么(this,param);

this.someFunction.call(this, param); 

,但在我看来只是一个打字

this.someFunction(param) 

的更详细的方法的模式有时会出现内部作为回调提供的功能。它恰好使用Backbone,以防相关。事情是这样的:

Backbone.View.extend({ 
    // other stuff ... 

    someFunction: function(param) { 
     // ... 
    }, 
    anotherFunction: function() { 
     this.collection.on("some_event", function() { 
      this.someFunction.call(this, param); 
     }); 
    } 
}); 

请问模式实际上有不是this.someFunction(param)或相当于是有人只是担心关闭不捕获正确this的影响?

感谢您的任何见解!

+3

*“或者是某人只是紧张的关闭不捕获正确的'this'”*'this'是函数内部的一个特殊值,不受范围的影响。 (例外:ES6箭头功能)。我没有看到在这里比通常的函数调用更喜欢'.call'的原因。 – 2015-03-18 22:38:23

+0

两者都可能是某种编码惯例。 脚本也经常被混淆。 – kidwon 2015-03-18 22:42:32

+0

请注意,使用call()会增加一些开销并降低执行速度,这在循环中尤其明显。代码实际上可以写为:this.collection.on(“some_event”,this.someFunction.bind(this,param));'它提前锁定_this_,可以比call()更快。尽管取决于骨干如何使用_this_,您可能需要在另一个函数()中复制绑定值以在当时拥有正确的_this_。 – dandavis 2015-03-18 22:52:37

回答

2

请问模式实际上有不是this.someFunction(param)同等的效果?

不,他们确实是一样的。假设this.someFunction是一个从Function.prototype继承.call的函数(但这是挑剔的)。

看起来有人过于谨慎,或者代码是两次没有使用this的东西的遗骸。或者,也许作者知道this-context-in-callbacks issue,但未能正确处理它。

1

我没有看到任何理由在您提供的代码中使用这种函数调用方式。这是更好地使用直接函数调用像这样(如果你需要的参数没有修改)

this.collection.on("some_event", this.someFunction, this); 

this.collection.on("some_event", function() { 
    this.someFunction(//some modified args) 
}, this); 

让我提供的.call正确使用的例子。当然u've看到这一点:

Array.prototype.slice.call(arguments, 2); 

作为arguments不是数组,我们可以“借用”阵列方法与arguments进行操作。如果你尝试致电slicearguments你会得到一个错误