为什么将Math对象设置为上下文?

时间:2014-01-18 20:43:46

标签: javascript

要在JavaScript中找到最少的数字数组,我们会执行以下操作:

var min_val = Math.min.apply(Math, [12,3,5,7,-1]);

你想在这里传递Math对象的任何可能的原因?

编辑:

还不清楚这种模式在哪里有意义

  

foo .fun.apply( foo ,数组)

4 个答案:

答案 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的详细信息。