请解释javascript中的应用和调用方法

please explain the apply and call methods in javascript

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the difference between call and apply?

apply和call方法的主要区别是什么…我上网找不到最好的解决办法。请帮我朋友们…


除了默认参数外,javascript中的每个函数还接收两个对象。这些是thisargumentsthis的值由它的调用模式决定。applycall可用于调用函数并为其提供默认的this对象。

这在许多情况下都非常有用。例如,arguments是一个类似数组的对象,但实际上不是一个拥有所有有用数组方法的Array。因此,要在arguments上应用数组方法slice,可以这样做:

1
Array.prototype.slice.apply(arguments, [1, 2])

如果argumentsArray类型的对象,您可以使用

1
arguments.slice(1, 2)

call只是apply的一个修改版本。见难以捉摸的评论。

Douglus Crockford先生在这段视频中非常好地介绍了javascript函数:函数终极版。


主要区别在于,call接受参数列表,其中第一个参数之后的参数直接传递给方法:

1
myFunc.call(thisObj, arg1, arg2, arg3);

鉴于apply只接受两个参数,第一个是this对象,第二个是传递给方法的参数数组:

1
myFunc.apply(thisObj, [arg1, arg2, arg3]);

apply通常用于希望将arguments对象传递给另一个方法的情况,该对象包含传递给当前函数的参数列表:

1
2
3
4
function myOtherFunc(arg1, arg2, arg3) {
    if (typeof arg1 =="object" && arg1 !== null)
        myFunc.apply(this, arguments);
}


.apply().call()非常相似。唯一的区别是它们如何向被调用函数传递参数。.apply()接受一个参数数组,而.call()可以像常规函数调用那样使用:

1
someFunction.apply(context, [argument1, argument2]);

相当于:

1
someFunction.call(context, argument1, argument2);