Math.max.apply()如何工作?
Math.max.apply()
如何工作?
<!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title>JS Bin</title> </head> <body> <script> var list = ["12","23","100","34","56", "9","233"]; console.log(Math.max.apply(Math,list)); </script> </body> </html>
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
上面的代码查找列表中的最大数量。 谁能告诉我下面的代码是如何工作的? 这似乎工作,如果我传递null or Math.
console.log(Math.max.apply(Math,list));
所有的user-defined/Native functions
都有调用和应用方法,我们可以使用?
apply
接受一个数组,并将该数组作为参数应用于实际函数。 所以,
Math.max.apply(Math, list);
可以理解为,
Math.max("12", "23", "100", "34", "56", "9", "233");
所以, apply
是一个方便的方法来将一个数组数组作为parameter passing给一个函数。 记得
console.log(Math.max(list)); # NaN
将不起作用,因为max
不接受数组作为input。
还有另外一个好处,就是使用apply
,你可以select你自己的上下文。 你通过apply
任何函数的第一个参数,就是this
函数里面的这个。 但是, max
不依赖于当前的上下文。 所以,任何事情都可以在Math
起作用。
console.log(Math.max.apply(undefined, list)); # 233 console.log(Math.max.apply(null, list)); # 233 console.log(Math.max.apply(Math, list)); # 233
由于apply
实际上是在Function.prototype
定义的 ,所以任何有效的JavaScript函数对象都会默认apply
函数。
谁能告诉我下面的代码是如何工作的?
Math.max.apply(Math,list)
用Math
对象调用Math.max
函数,将其用作函数实现(body)和list
中的引用,作为parameter passing。
所以这最终等于
Math.max("12","23","100","34","56", "9","233")
这似乎工作,如果我传递null或math。
Math.max
实现显然不使用实例variables – 没有理由这样做。 天真的实现只是迭代arguments
并find最大的一个。
所有的用户定义/本机函数都有调用和应用方法,我们可以使用?
是的,每个函数都可以使用call
或apply
来调用
参考文献:
- MDN
.apply()
文档 (信贷给@RGraham )
在JavaScript ES6上只使用Spread运算符 :
var list = ["12","23","100","34","56","9","233"]; console.log(Math.max(...list)); // ^^^ Spread operator
Math.max(val1,val2,…)
Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...
是参数,必须是Numbers MDN Math.max
您不能将array
作为Math.max
parameter passing。 要传递一个数组,你必须使用apply
。
应用
apply的第一个参数是this
,第二个是array
。 math方法相当于其他语言的静态,这意味着它不需要一个对象实例,而不像array.prototype.slice
所以在这种情况下你不需要传递this
。
例
var arr = [1, 2, 3]; Math.max(1, 2, 3); // -> 3 Math.max(arr); // -> NaN (Not a Number) Math.max.apply(null, arr); // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3 arr.slice(1); // -> returns Array [2, 3] Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)
当你想传递一个数组作为参数时,你必须使用apply
,否则使用call
。
一个 pply = 一个 rray
c all = c omma分隔
更多关于通话和申请