5

如果您要求我获取数组的最大值,我会这样做:

var nums = [66,3,8,213,965,1,453];
Math.max.apply(Math, nums);

当然,我也可以这样做: nums.sort(function(a, b){ return a - b}.pop(nums.length);

但我必须说实话。我需要知道为什么有效 - 使用 .apply(Math,nums)。如果我只是这样做:

Math.max(nums);

那是行不通的。

通过使用 apply,我将 Math 作为 - 和数组的 nums 传递。但我想知道第一个有效而后者无效的“为什么”的复杂性。发生了什么魔法?

有一些基本的东西我没有绕开我的大脑。我读过很多关于“打电话和申请”的文章,但很多时候可以有一些很酷的技巧,比如上面的那个,我觉得我在这里错过了一些更深层次的东西。

4

1 回答 1

7

正如您可以在此处阅读的有关Function.prototype.apply的内容,apply调用具有给定this值和参数的函数作为array. 所以apply函数的第二个参数接受arrays,这就是它起作用的原因。

虽然Math.max()本身需要任意数量的参数而不是它们的数组:

Math.max(66,3,8,213,965,1,453) //will work
Math.max([66,3,8,213,965,1,453]) //will not work

通常,您将使用apply不知道参数数量的动态参数(例如用户生成)来调用函数。另一方面,如果您有固定数量的参数,那么您可以轻松地提供它们来Math.max()运行。

于 2013-08-31T09:01:53.023 回答