please explain the apply and call methods in javascript
Possible Duplicate:
What is the difference between call and apply?
apply和call方法的主要区别是什么…我上网找不到最好的解决办法。请帮我朋友们…
- 没有最佳解决方案;)
- @费利克斯+1,我没想到这可能是个骗局。
- @菲利克斯·克林:哎呀,没注意到那个;)
- @安迪E,@难以捉摸:不用担心,伙计们,我自己回答了足够多的重复问题:)
除了默认参数外,javascript中的每个函数还接收两个对象。这些是this和arguments。this的值由它的调用模式决定。apply或call可用于调用函数并为其提供默认的this对象。
这在许多情况下都非常有用。例如,arguments是一个类似数组的对象,但实际上不是一个拥有所有有用数组方法的Array。因此,要在arguments上应用数组方法slice,可以这样做:
1
| Array.prototype.slice.apply(arguments, [1, 2]) |
如果arguments是Array类型的对象,您可以使用
call只是apply的一个修改版本。见难以捉摸的评论。
Douglus Crockford先生在这段视频中非常好地介绍了javascript函数:函数终极版。
- 关于arguments的内容有什么相关性?
- OP已经问了一段时间关于JavaScript的问题。我以为他是从JS开始的。我认为适当地介绍函数调用模式对他是有用的。:)
主要区别在于,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。然而,call并不能很好地取代apply,因为它没有那么动态。我更新了我的答案,给你一个使用apply的例子。
- @米希尔:call只是apply的句法糖。使只使用一个参数调用函数更容易。
.apply()和.call()非常相似。唯一的区别是它们如何向被调用函数传递参数。.apply()接受一个参数数组,而.call()可以像常规函数调用那样使用:
1
| someFunction.apply(context, [argument1, argument2]); |
相当于:
1
| someFunction.call(context, argument1, argument2); |
- 谢谢你,很高兴听到……但是我们能在任何情况下使用任何方法吗,或者这些方法有什么限制吗?
- @mihir:这两个方法都是函数对象原型的成员。两者都可以用于任何函数。