在查看raphael、g.raphael或其他库的源代码时,我注意到开发者会这样做:
var val = Math.max.apply(Math, data_array);
为什么不直接调用函数,例如:
var val = Math.max(data_array);
谢谢。
在查看raphael、g.raphael或其他库的源代码时,我注意到开发者会这样做:
var val = Math.max.apply(Math, data_array);
为什么不直接调用函数,例如:
var val = Math.max(data_array);
谢谢。
默认情况下,Math.max不接受列表作为参数。使用"apply"可以将列表解包成参数,以便max函数正常工作。
我认为Mozilla文档中的解释已经很清楚了:
在调用现有函数时,您可以分配不同的this对象。 this指的是当前对象,即调用对象。使用apply,您可以编写一次方法,然后在另一个对象中继承它,而无需为新对象重写该方法。
apply与call非常相似,除了它支持的参数类型不同。您可以使用参数数组而不是命名的参数集。使用apply,您可以使用数组字面量,例如fun.apply(this,[name,value]),或Array对象,例如fun.apply(this,new Array(name,value))。
至于参数:
确定fun内部的this值。如果thisArg为null或undefined,则this将是全局对象。否则,this将等于Object(thisArg)(如果thisArg已经是一个对象,则是thisArg;如果thisArg是相应类型的原始值的字符串、布尔值或数字,则是String、Boolean或Number)。因此,在函数执行时,typeof this == "object"总是成立。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
构造函数的参数数组。
prod_dept.prototype = new product();
这行代码完全不需要,可以删除以简化代码! - Pratik Joshi为什么要使用“apply”来调用函数而不是直接调用呢?我们来看一段代码:
var obj = {a: "apply"};
func.call(obj, "parameter");
function func(para) {
if(this.a === "apply"){
console.log('apply');
}
}
在这里,我们可以看到在一个函数内使用了'this'
(上下文)。如果我们直接调用一个函数,那么我们就没有任何上下文,这时它会采用window
上下文,这是错误的。所以,如果你在函数内使用上下文,那么就使用apply
方法。
apply()
和call()
来设置调用函数所属的上下文或对象。然后该函数有效地成为该对象/上下文的方法,如果您需要访问上下文的字段,则非常有帮助。call()
或apply()
指定上下文时,Javascript会将'window'
或'undefined'
作为上下文传递。
这个 答案 还提供了一个例子,有助于理解用法。
.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 开始,您可以使用扩展运算符:
扩展运算符允许在期望多个参数(用于函数调用)或多个元素(用于数组字面量)的位置展开表达式。
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
Math.max(array)
的例子是行不通的。所以,我的问题是,我的问题中的第一行代码如何在数据数组的每个元素上调用“max”? - codecraig.apply
和.call
真是太棒了! - Rudie