我对在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()?
发布于 2012-01-25 19:27:38
当您想要控制将在调用的函数中使用的作用域时,可以使用call
。您可能希望this
关键字不是您分配函数的作用域,在这些情况下,您可以使用call
或apply
在您自己的作用域中调用函数。
F.ex,它还允许您在作用域之外调用实用程序方法,比如在使用“私有”函数时:
var obj = (function() {
var privateFn = function() {
alert(this.id);
}
return {
id: 123,
publicFn: function() {
privateFn.call(this);
}
};
}());
obj.publicFn();
在上面的示例中,privateFn
没有在obj
中公开,但它仍然可以被构造为公共作用域的一部分(以同样的方式使用this
)。
发布于 2012-01-25 19:29:42
您可能会在示例中使用第二种方法,但有时您希望在另一个对象上使用一个对象的函数。一个例子是在类似数组的对象上使用Array
方法,比如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
});
发布于 2012-01-25 19:32:06
这与first class function的概念有关。基本上,像Javascript这样的语言允许你把函数当作它们自己的权利。函数可以存储在变量中,也可以传递给其他函数。
call()
提供了一种执行不附加到任何其他对象的独立函数的方法。
https://stackoverflow.com/questions/9001830
复制相似问题