Javascript 为什么要将数学对象设置为上下文?
要在JavaScript中查找数字数组的最小值,我们可以执行以下操作:Javascript 为什么要将数学对象设置为上下文?,javascript,Javascript,要在JavaScript中查找数字数组的最小值,我们可以执行以下操作: var min_val = Math.min.apply(Math, [12,3,5,7,-1]); 你有什么理由想把数学对象传给这里吗 编辑: 仍不清楚这种模式在哪里有意义 foo.fun.apply(foo,数组) Math.min内部实现可以使用此。所以最好还是留着它 好吧,document.getElementById(和其他)就是这样:你不能只做$=document.getElementById,当我调用它时,它
var min_val = Math.min.apply(Math, [12,3,5,7,-1]);
你有什么理由想把数学对象传给这里吗
编辑:
仍不清楚这种模式在哪里有意义
foo.fun.apply(foo,数组)
Math.min
内部实现可以使用此
。所以最好还是留着它
好吧,
document.getElementById
(和其他)就是这样:你不能只做$=document.getElementById
,当我调用它时,它抛出TypeError:Invalical invocation
。在这种情况下,第一个参数是任意的:
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值=[],
foo={
set:function(){this.inputs=Array.prototype.slice.call(参数,0);},
sum:function(){
变量i=0,总计=0;
对于(;i
简单的回答是因为你必须这样做。Apply将方法的上下文作为第一个参数。我相信Math.min也可以在全局范围内使用,因此您可以编写
Math.min.apply(null,[12,3,5,7,-1]);
还有其他不需要您这样做的编写方法(例如,您可以只编写Math.min([12,3,5,7,-1]),但这一切都取决于您如何使用它
您可以找到有关应用和上下文的更多详细信息。无需在此处传递
数学
回答您的编辑:
仍然不清楚这种模式在哪里有意义:foo.fun.apply(foo,
阵列)
让我们试着用例子来演示:
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
在全局范围(window
)中执行foo.fun
),因此需要一个上下文(scope)来引用上下文的属性(foo
或bar
),您只需传递0
可能重复的1)为什么?2) 除非文件中有说明,否则任何“内部”细节都不能被考虑。@OlegV.Volkov,那么您知道所有这些文件细节了吗?对我来说,在正确的上下文中调用apply
要比记住(或者在编码时去检查)容易得多。为什么呢,ECMAScript标准版5的第15.8.2.12节会告诉你关于Math.min
的一切。说任何在那个里或特定环境发布说明中未提及的话都会毫无理由地传播错误信息。@OlegV.Volkov,我不怀疑在标准中。但是你每行都提到它吗?我认为,按照问题中所述的方式来做比其他方式更“防bug”。是的,我这样做,除非特定的引擎注释另有说明。Math.min([12,3,5,7,-1])
返回NaN
Oops,你说得对。这应该是Math.min(12,3,5,7,-1)。没有方括号。Math.min希望参数是一个或多个数字,而不是数组。
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]