首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JS .call()方法的原因?

使用JS .call()方法的原因?
EN

Stack Overflow用户
提问于 2012-01-25 19:19:57
回答 3查看 29.1K关注 0票数 65

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

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

代码语言:javascript
复制
var obj = {
    objType: "Dog"
}

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

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

输出结果是“狗吃的食物”。但将函数赋值给对象也会得到相同的结果。

代码语言:javascript
复制
var obj = {
    objType: "Dog"
}

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-25 19:27:38

当您想要控制将在调用的函数中使用的作用域时,可以使用call。您可能希望this关键字不是您分配函数的作用域,在这些情况下,您可以使用callapply在您自己的作用域中调用函数。

F.ex,它还允许您在作用域之外调用实用程序方法,比如在使用“私有”函数时:

代码语言:javascript
复制
var obj = (function() {
    var privateFn = function() {
        alert(this.id);
    }
    return {
        id: 123,
        publicFn: function() {
            privateFn.call(this);
        }
    };
}());

obj.publicFn();

在上面的示例中,privateFn没有在obj中公开,但它仍然可以被构造为公共作用域的一部分(以同样的方式使用this )。

票数 66
EN

Stack Overflow用户

发布于 2012-01-25 19:29:42

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

代码语言:javascript
复制
var el = document.getElementById("foo");
[].forEach.call(el.children, function(child, index) {
    //Iterate over an element's children, performing an action on each one
});
票数 6
EN

Stack Overflow用户

发布于 2012-01-25 19:32:06

这与first class function的概念有关。基本上,像Javascript这样的语言允许你把函数当作它们自己的权利。函数可以存储在变量中,也可以传递给其他函数。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9001830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档