通话和申请有什么区别?

使用callapply来调用函数有什么区别?

var func = function(){
  alert('hello!');
};

func.apply();

VS

func.call();

这两种方法之间是否存在性能差异? 什么时候最好使用call apply ,反之亦然?


区别在于apply可以让你用arguments作为数组调用函数; call需要显式列出参数。 有用的助记为“用于对C OMMA 一个 rray和C A”。

请参阅MDN关于申请和通话的文件。

伪语法:

theFunction.apply(valueForThis, arrayOfArgs)

theFunction.call(valueForThis, arg1, arg2, ...)

从ES6开始,还可以spread数组以便与call函数一起使用,您可以在这里看到兼容性。

示例代码:

function theFunction(name, profession) {
    console.log("My name is " + name + " and I am a " + profession +".");
}
theFunction("John", "fireman");
theFunction.apply(undefined, ["Susan", "school teacher"]);
theFunction.call(undefined, "Claude", "mathematician");
theFunction.call(undefined, ...["Matthew", "physicist"]); // used with the spread operator

K.斯科特艾伦在这件事上有一个很好的写作。

基本上,他们在处理函数参数方面有所不同。

apply()方法与call()完全相同,除了apply()需要数组作为第二个参数。 该数组表示目标方法的参数。“

所以:

// assuming you have f
function f(message) { ... }
f.call(receiver, "test");
f.apply(receiver, ["test"]);

要回答关于何时使用每个函数的部分,如果您不知道要传递的参数的数量,或者它们已经在数组或类似数组的对象中,请使用apply (例如arguments对象要转发您自己的数据参数,否则使用call ,因为不需要将参数包装在数组中。

f.call(thisObject, a, b, c); // Fixed number of arguments

f.apply(thisObject, arguments); // Forward this function's arguments

var args = [];
while (...) {
    args.push(some_value());
}
f.apply(thisObject, args); // Unknown number of arguments

当我没有传递任何参数时(比如你的例子),我更喜欢call因为我正在调用这个函数。 apply意味着你将这个函数应用于(不存在的)参数。

不应该有任何性能差异,除非可能如果您使用apply并将参数包装在数组中(例如f.apply(thisObject, [a, b, c])而不是f.call(thisObject, a, b, c) )。 我没有测试过,所以可能会有差异,但它会非常适合浏览器。 如果你没有在数组中拥有参数,那么call速度可能会更快,如果你这样做, apply会更快。

链接地址: http://www.djcxy.com/p/379.html

上一篇: What is the difference between call and apply?

下一篇: Iterate through a HashMap