我在很多地方遇到过一些具有这种模式的代码:
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
而感到紧张?
感谢您的任何见解!
答案 0 :(得分:2)
不,他们确实是一样的。假设模式实际上是否具有相当于
this.someFunction(param)
的效果?
this.someFunction
是一个从.call
继承Function.prototype
的函数(但这是一次挑选)。
看起来有人过于谨慎,或者代码是一些未使用this
两次的遗骸。或者作者可能知道this
-context-in-callbacks issue但未能正确处理它。
答案 1 :(得分:1)
我没有看到任何理由在您提供的代码中使用这种函数调用方式。这里最好使用这样的直接函数调用(如果你不需要修改参数)
this.collection.on("some_event", this.someFunction, this);
或
this.collection.on("some_event", function() {
this.someFunction(//some modified args)
}, this);
让我提供正确使用.call
的示例。当然你已经看过了:
Array.prototype.slice.call(arguments, 2);
由于arguments
不是数组,我们可以“借用”Array方法与arguments
一起操作。如果您尝试在slice
上致电arguments
,则会收到错误