为什么调用“apply”而不是直接调用函数?
当为拉斐尔或g.raphael或其他图书馆我已经注意到了开发商的源代码看确实是这样的:为什么调用“apply”而不是直接调用函数?
var val = Math.max.apply(Math, data_array);
为什么不直接调用的功能,如:
var val = Math.max(data_array);
谢谢。
我觉得从Mozilla Docs解释描述得好:
调用现有的功能时,您可以分配不同的此对象 。 这个是指当前对象,即 调用对象。通过申请,您可以在 中写入一次方法,然后在另一个对象中继承 ,而不必为 重写新的 对象的方法。
应用与呼叫非常相似,但支持的参数类型为 。 您可以使用参数数组而不是 命名的一组参数。与 应用,可以使用一个数组文本, 例如,fun.apply(此,[名称, 值]),或阵列对象, 例如fun.apply(这一点,新 阵列(名称,值))。
至于参数:
thisArg 确定的这里面好玩的价值。如果thisArg为空或 undefined,这个将是全球 对象。否则,这将等于 到Object(thisArg)(如果thisArg已经是对象,则为thisArg ,或 字符串,布尔值或数字(如果thisArg 是 对应类型的原始值)。因此,当该函数执行时,这个==“ ”对象的类型总是为 。
argsArray 的参数数组为对象,指定与该 乐趣应该被调用,或空或 未定义如果没有参数应该提供给函数 的参数。
该文档给出了适用的用例的一个很好的例子。在下面的例子,应用用于链构造:
function product(name, value)
{
this.name = name;
if (value >= 1000)
this.value = 999;
else
this.value = value;
}
function prod_dept(name, value, dept)
{
this.dept = dept;
product.apply(this, arguments);
}
prod_dept.prototype = new product();
// since 5 is less than 1000 value is set
var cheese = new prod_dept("feta", 5, "food");
// since 5000 is above 1000, value will be 999
var car = new prod_dept("honda", 5000, "auto");
注意,在prod_dept
构造,供给的this
指prod_dept
对象,arguments
是传递给product
一个数组构造参数。
默认情况下,Math.max不接受列表。 “apply”允许您将列表解压缩为参数,以便max正常工作。
为什么调用“apply”而不是直接调用函数?让我们有一个片段:
var obj = {a: "apply"};
func.call(obj, "parameter");
function func(para) {
if(this.a === "apply"){
console.log('apply');
}
}
在这里我们可以我们使用'this'
(上下文)的函数中,如果我们直接调用FUNC不是我们没有任何背景,比它会采取window
方面看,这是错的。所以,如果你在你的函数中使用上下文,那么比使用apply
方法。
.apply
当意图使用参数值列表来调用可变参数时经常使用,例如,
Math.max([value1[,value2, ...]])
函数返回零个或多个数字中最大的一个。
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
Math.max()
方法不允许您传入数组。如果您有一个需要获得最大值的值列表,您通常会使用Function.prototype.apply()(例如,
Math.max.apply(null, [10, 20]); // 20
Math.max.apply(null, [-10, -20]); // -10
Math.max.apply(null, [-10, 20]); // 20
然而,随着ECMAScript的6,你可以使用spread operator:
蔓延运营商允许表达式的地方扩展,其中多个参数(函数调用)或多个元素(数组文字)。
Math.max(...[10, 20]); // 20
Math.max(...[-10, -20]); // -10
Math.max(...[-10, 20]); // 20
当调用使用一个可变操作的功能,你甚至可以添加额外的值,例如
Math.max(...[10, 20], 50); // 50
Math.max(...[-10, -20], 50); // 50
通常你会使用apply()
和call()
能够设置上下文或到调用函数所属的对象。然后,该函数将有效地成为该对象/上下文的一种方法,如果您需要访问上下文的字段,该方法将非常有用。
这是使用Javascript如何本身调用功能:通过端
- 做一个参数列表(arglist中)出来的参数1 thisValue和ARGLIST作为它的参数列表
参考:Understanding JavaScript Function Invocation and "this"通过Yehuda Katz
所以,当直接调用函数时,实际上是隐式地将默认上下文传递给该函数。通过使用Javascript或'window'
作为'undefined'
当你不使用call()
或apply()
这answer还举了一个例子可能在理解使用
好了,所以我看到Math.max有两个参数,以便帮助其指定的上下文我只是打电话的例子, Math.max(阵列) 不起作用。所以,我想问题是我的问题中的第一行代码如何在data_array的每个元素上调用“max”? – codecraig 2011-05-09 12:05:59
Javascript的'.apply'和'.call' ftw !! – Rudie 2011-05-09 12:08:14