this.someFunction.call(this,param)的目的是什么?

时间:2015-03-18 22:35:19

标签: javascript backbone.js

我在很多地方遇到过一些具有这种模式的代码:

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而感到紧张?

感谢您的任何见解!

2 个答案:

答案 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,则会收到错误