要在JavaScript中找到最少的数字数组,我们会执行以下操作:
var min_val = Math.min.apply(Math, [12,3,5,7,-1]);
你想在这里传递Math对象的任何可能的原因?
编辑:
还不清楚这种模式在哪里有意义
foo .fun.apply( foo ,数组)
答案 0 :(得分:1)
Math.min
内部实施可以使用this
。所以保留它会更好。
AFAIK,document.getElementById
(和其他人)就是这种情况:你不能只做$ = document.getElementById
,而是在我打电话时抛出TypeError: Illegal invocation
。
答案 1 :(得分:1)
此处无需传递Math
。
回答你的编辑:
还不清楚这种模式在哪里有意义:
foo.fun.apply(foo, array)
让我们试着通过例子来证明:
var foo = {
fun: function(a,b,c){ console.log(this.bar, [a,b,c]); },
whatsthis: function(){ console.log(this);},
bar: 5
};
var bar = {bar: 10};
foo.fun.apply(null, [1,2,3]); //=> prints undefined, [1,2,3]. Why?
foo.whatsthis.apply(null); //=> aha: prints Window
foo.fun.apply(foo, [1,2,3]); //=> prints 5, [1,2,3]
// apply foo.fun within bar context:
foo.fun.apply(bar, [1,2,3]); //=> prints 10, [1,2,3]
因此,foo.fun.apply
在全局范围(foo.fun
)中执行window
,因此需要一个上下文(范围)才能引用上下文的属性({{1 }或foo
)。
答案 2 :(得分:0)
在这种情况下,第一个参数是任意的:
console.log( Math.min.apply(Math, [12,3,5,7,-1]) );
console.log( Math.min.apply(null, [12,3,5,7,-1]) );
console.log( Math.min.apply(0, [12,3,5,7,-1]) );
console.log( Math.min.apply(undefined, [12,3,5,7,-1]) );
console.log( Math.min.apply(-10, [12,3,5,7,-1]) );
以上所有输出-1
。
因此,没有特别的理由在此实例中传递Math
对象。
修改强>
将参数从一个函数传递给另一个函数时,模式foo.fun.apply( foo, array )
是有意义的:
wrapper = function(){
// call foo.fun() with the same arguments as were
// passed to the wrapper function.
var rtn = foo.fun.apply( foo, arguments );
// do something with the return value.
}
你也可以在动态定义一个函数的参数时使用它(这个例子有点人为,但希望能给你一个想法):
var values = [],
foo = {
set: function(){ this.inputs = Array.prototype.slice.call( arguments, 0 ); },
sum: function(){
var i=0,total=0;
for ( ; i < this.inputs.length; ++i )
total += this.inputs[i];
return total;
},
inputs: []
};
console.log( foo.sum() ); // Outputs 0
// Get user to add values from somewhere (i.e. a HTML input field)
values.push(1);
values.push(2);
// Once finished call foo.set
foo.set.apply( foo, values );
console.log( foo.sum() ); // Outputs 3
答案 3 :(得分:0)
简短的回答是因为你必须这样做。 Apply将方法的上下文作为第一个参数。我相信Math.min也可以在全球范围内使用,所以你可以写
Math.min.apply(null,[12,3,5,7,-1]);
还有其他方法来编写它不需要你这样做(例如,你可以只写Math.min([12,3,5,7,-1])),但这一切都取决于你正在做什么。
您可以找到有关应用和上下文here的详细信息。