2011-05-09 116 views
12

当为拉斐尔或g.raphael或其他图书馆我已经注意到了开发商的源代码看确实是这样的:为什么调用“apply”而不是直接调用函数?

var val = Math.max.apply(Math, data_array); 

为什么不直接调用的功能,如:

var val = Math.max(data_array); 

谢谢。

+0

好了,所以我看到Math.max有两个参数,以便帮助其指定的上下文我只是打电话的例子, Math.max(阵列) 不起作用。所以,我想问题是我的问题中的第一行代码如何在data_array的每个元素上调用“max”? – codecraig 2011-05-09 12:05:59

+2

Javascript的'.apply'和'.call' ftw !! – Rudie 2011-05-09 12:08:14

回答

11

我觉得从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构造,供给的thisprod_dept对象,arguments是传递给product一个数组构造参数。

12

默认情况下,Math.max不接受列表。 “apply”允许您将列表解压缩为参数,以便max正常工作。

2

为什么调用“apply”而不是直接调用函数?让我们有一个片段:

var obj = {a: "apply"}; 
func.call(obj, "parameter"); 
function func(para) { 
    if(this.a === "apply"){ 
     console.log('apply'); 
    } 
} 

在这里我们可以我们使用'this'(上下文)的函数中,如果我们直接调用FUNC不是我们没有任何背景,比它会采取window方面看,这是错的。所以,如果你在你的函数中使用上下文,那么比使用apply方法。

0

.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 
0

通常你会使用apply()call()能够设置上下文或到调用函数所属的对象。然后,该函数将有效地成为该对象/上下文的一种方法,如果您需要访问上下文的字段,该方法将非常有用。

这是使用Javascript如何本身调用功能:通过端

  • 第一个参数是thisValue
  • 调用函数使用这组到

    1. 做一个参数列表(arglist中)出来的参数1 thisValue和ARGLIST作为它的参数列表

    参考:Understanding JavaScript Function Invocation and "this"通过Yehuda Katz

    所以,当直接调用函数时,实际上是隐式地将默认上下文传递给该函数。通过使用Javascript或'window'作为'undefined'当你不使用call()apply()

    answer还举了一个例子可能在理解使用

  • 相关问题