使用JS .call()方法的原因是什么?

时间:2012-01-25 11:19:57

标签: javascript function methods this

我很感兴趣在JS中使用call()方法的原因是什么。它似乎与通常调用this的方法重复。

例如,我有一个带call()的代码。

var obj = {
    objType: "Dog"
}

f = function(did_what, what) {
    alert(this.objType + " " + did_what + " " + what);
}

f.call(obj, "ate", "food");

输出是“狗吃了食物”。但是同样的结果我可以将函数分配给对象。

var obj = {
    objType: "Dog"
}

f = function(did_what, what) {
    alert(this.objType + " " + did_what + " " + what);
}

obj.a = f;
obj.a("ate", "food");

结果是一样的。但这种方式更容易理解和使用。为什么需要call()?

4 个答案:

答案 0 :(得分:61)

当您想要控制将在调用的函数中使用的范围时,使用

call。您可能希望this关键字不是您为该函数指定的范围,在这种情况下,您可以使用callapply来调用具有您自己范围的函数。< / p>

F.ex,它还允许您调用范围之外的实用程序方法,例如使用“私有”函数时:

var obj = (function() {
    var privateFn = function() {
        alert(this.id);
    }
    return {
        id: 123,
        publicFn: function() {
            privateFn.call(this);
        }
    };
}());

obj.publicFn();

在上面的示例中,privateFn中未公开obj,但它仍然可以构建为公共范围的一部分(以相同的方式使用this

答案 1 :(得分:38)

2017年更新

通过Function.prototype的所有函数都有.call方法。使用.call()的原因是指定变量&#34; this&#34;是指。

MDN指定:

  

call()方法调用具有给定值的函数   论据单独提供。

请考虑以下事项:

function x() {
    return this;
}

x()

在严格模式下x()在非严格模式下返回undefined,它会在浏览器上下文中返回Global对象Window

.call()示例我们告诉它&#34; this&#34;指:

function x() {
    return this;
}

var obj = {
    myName      : 'Robert',
    myLocation  : 'Earth'
}

x.call(obj);

结果:{myName: "Robert", myLocation: "Earth"}。在上面的示例中,我们将obj对象指定为函数this中的x()的值

它可以用于在OOP中模拟继承。

示例:

var Robert = {
    name: "Robert Rocha",
    age: 12,
    height: "5,1",
    sex: "male",
    describe: function() {
        return "This is me " + this.name + " " + this.age + " " + this.height + " " + this.sex;
    }
};

让我们说上面是一个主对象(原型),你想在另一个对象中继承函数describe

var Richard = {
    name: "Richard Sash",
    age: 25,
    height: "6,4",
    sex: "male",
}

Richard对象没有describe函数,你只想简单地继承函数。你会这样做:

console.log( Robert.describe.call( Richard ) );

输出:This is me Richard Sash 25 6,4 male

答案 2 :(得分:6)

您可能会在示例中使用第二种方法,但有时您希望在另一个对象上使用一个对象的函数。一个例子是在像Array s

这样的类似对象的对象上使用NodeList方法
var el = document.getElementById("foo");
[].forEach.call(el.children, function(child, index) {
    //Iterate over an element's children, performing an action on each one
});

答案 3 :(得分:3)

这与first class function的概念有关。基本上像Javascript这样的语言允许您将函数视为自己的事物。函数可以存储在变量中或传递给其他函数。

call()提供了一种执行未附加到任何其他对象的独立功能的方法。