2014-03-12 30 views
5

我经历约翰Resig的JavaScript的忍者教程和#51我看到这一点:为什么要将Math作为Math.max.apply的第一个参数?

// Find the largest number in that array of arguments 
var largestAllButFirst = Math.max.apply(Math, allButFirst); 

allButFirst是整数的只是一小阵。我相信我明白apply做什么,但我不明白为什么Math作为参数传递给apply

回答

1

通过它Math是没有必要的,任何东西都可以在这里工作。 Math指示操作的上下文,但max不需要上下文。这意味着Math.max.apply(undefined, allButFirst)也将工作。请参阅this的答案。

+4

@JakeSellers对'Math.max'具体而言,我确定其他一些功能,这真的没有关系。关键是'Math.max' **不依赖或使用'this'值** ......但许多其他函数**都可以**。虽然它在技术上是可选的,但我会建议总是传递它,因为**通常**称它为'Math.max()'(''这个'值是'Math')。我宁愿安全,也不要对这样一件小事感到抱歉,也要保持一致。 – Ian

+0

@ian ok,谢谢 –

+0

@ian在[文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments)中的参数,你可以看到他们使用' Array.prototype.slice.call(arugments)'将参数更改为一个没有上下文给定的数组。你对此有何看法?我有时候会使用这种技术,如果我不担心它或传递一个上下文,或许只是本地函数上下文中的“this” –

0

Mozilla docs

fun.apply(thisArg,[argsArray])

thisArg:提供用于调用乐趣的这个值。请注意,此 可能不是该方法看到的实际值:如果该方法是非严格模式代码中的 函数,则空值和未定义值将被全局对象替换为 ,并且原始值将被装箱。

所以,在你的榜样,Math被用作该函数的上下文(如果关键字this是内部使用)。

如果没有使用thisArg,则默认为全局对象。所以,如果可能的话,给出一些上下文是一个好习惯。

3

.apply的第一个参数是上下文。在函数体内部,this关键字将引用该值。

例子:

function sum(a){ return this + a; } 
sum.apply(1, [1]); // will return 2 
// or with .call 
sum.call(1, 1); // also returns 2 

默认情况下,如果你打电话Math.max的上下文(this关键字)会自动设置为Math。为了保持这种行为,Math作为apply中的第一个参数传递。

+0

范围与'this'无关。这是两回事。 –

+1

你说得对,我应该说上下文来代替。抱歉。 – lionel

相关问题