我很感兴趣在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()?
答案 0 :(得分:61)
call
。您可能希望this
关键字不是您为该函数指定的范围,在这种情况下,您可以使用call
或apply
来调用具有您自己范围的函数。< / 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()
提供了一种执行未附加到任何其他对象的独立功能的方法。