采用一个简单的匿名函数,它接受3个参数:
function hello(firstname, surname, city) {
console.log('Hi ' + firstname + ' ' +
surname + '. I see you\'re from ' + city)
}
使用函数方法“call”调用此函数有什么好处,只需调用函数?,即。
hello('Jane','Mansfield','Philadelphia');
VS
hello.call(this,'Jane','Mansfield','Philadelphia');
Fiddle-dee-dee:http://jsfiddle.net/wC3xz/1/
很抱歉,但是查看文档并没有任何消息。我唯一能想到的是你是否可以访问传递给函数的this对象。但是不会在匿名函数中访问它,这是匿名函数即窗口的上下文吗?
何时需要调用而不仅仅是functionname(args)?
答案 0 :(得分:10)
第15.3.4.4节中的呼叫为defined in the spec。当您尝试在函数内部设置thisArg时,可以使用.call
。
以下是如何使用的示例:
var me = { name: 'dr.eval' }
foo.call(me); // if you omitted the 'call' it would error because this defaults to the window object.
function foo() {
alert(this.name + ' is home');
}
您可以在此处详细了解:Function.prototype.call
使用call时,这是一个非常规范的例子:
许多DOM方法返回NodeList
。虽然NodeList是array-like object,但您无法在其上本地调用数组方法。但是,由于它们是类数组,因此可以使用.call
如果您打开控制台并键入
document.getElementsByTagName("a").forEach
你会得到未定义的,因为它返回一个NodeList,它没有forEach方法。但是,可能需要迭代NodeList,因此您可以执行以下操作:
[].forEach.call(document.getElementsByTagName("a"),function(elem){
console.log(elem);
});
这将记录页面上的所有锚元素。
另一个常见的例子是arguments
,它是另一个“Array Like”对象。通常,我们希望像数组一样处理参数,但我们不能。再次,.call
来救援,我们可以做到:
[].slice.call(arguments,0); // returns a clone of arguments, but a real array we can work with!
在处理事件时它也很有用,一般来说它显示了JavaScript的灵活性。这是一种在对象之间共享功能的方法,否则将无法共享它。
答案 1 :(得分:2)
使用函数方法“call”调用此函数有什么好处,只需调用函数?
何时需要调用而不仅仅是functionname(args)?
当您想要在不同的上下文中调用现有方法时。例如,参数对象与Array
类似,但您无法直接使用sort()
。
function Test() {
// call sort from Array context onto arguments object
console.log(Array.prototype.sort.call(arguments)); // 2 3 5 8
// error: arguments object doesn't contain sort
console.log(arguments.sort());
}
Test(5,3,8,2);
答案 2 :(得分:1)
答案 3 :(得分:0)
通常使用call()的好处是它允许您显式设置函数的上下文。对于你所展示的简单函数,没有多少价值,但如果你的函数是一个对象的方法,或者它是一个回调,设置上下文可能是相关的。