为什么要将'null'传递给'apply'或'call'?

Ant*_*tiz 13 javascript

根据这个JavaScript参考:

值null是表示null或"空"值的JavaScript文字,即不存在对象值.它是JavaScript的原始值之一.

function getMax(arr){
  return Math.max.apply(null, arr);  
}
Run Code Online (Sandbox Code Playgroud)

不明确传递关键字this更清晰,或至少更具可读性?然后,在这一点上,我可能不明白你为什么要使用null.

Chr*_*tos 12

调用apply,使用null作为第一个参数是像调用函数而无需为提供任何对象this.

apply方法有什么作用?

apply()方法调用具有给定this值的函数,并 arguments作为数组(或类数组对象)提供.

fun.apply(thisArg, [argsArray])
Run Code Online (Sandbox Code Playgroud)

thisArg

这个值为乐趣召唤提供了.请注意,这可能不是方法看到的实际值:如果方法是非严格模式代码中的函数,则null和undefined将替换为全局对象,并且原始值将被加框.

可在此处找到更多文档.

  • 这并没有回答"为什么"有人会这样做,这就是OP所要求的. (8认同)
  • 当`this`的值对被调用的函数没有影响时,您传递null。 (2认同)

jfr*_*d00 11

为什么要将'null'传递给'apply'或'call'?

如果没有值,您希望为this函数内部的指针指定值,并且您调用的函数不期望特定this值以便正常运行.

不明确传递关键字这个更清楚吗?或者至少更具人性化.然后在这一点上我可能不明白为什么你会使用null.

在您的具体情况下,最好的方法是传递Math对象:

function getMax(arr){
  return Math.max.apply(Math, arr);  
}
Run Code Online (Sandbox Code Playgroud)

虽然事实证明你传递的内容与第一个参数无关Math.max.apply(...)(仅因为实现细节Math.max()),但是传递Maththis指针设置为与正常调用它时设置的完全相同的东西,就像Math.max(1,2,3)这样是最安全的选择,因为你最好模拟正常的呼叫Math.max().

为什么要将'null'传递给'apply'或'call'?

这里有一些更多的细节......当使用.call().apply(),null可当你有,你要设置的没有特定的值传递this指针,你知道你调用的函数并不期望this有任何具体的值(例如它不要this在其实施中使用).

注意:使用nullwith .apply()或者.call()通常仅使用作为名称空间原因的方法的函数,而不是出于面向对象的原因.换言之,该函数max()是上的方法Math,只是由于命名空间的原因对象,而不是因为Math对象有实例数据,该方法.max()需要访问.


如果你这样做:

   function foo() {
       this.multiplier = 1;
   }

   foo.prototype.setMultiplier = function(val) {
       this.multiplier = val;
   }

   foo.prototype.weightNumbers = function() {
       var sum = 0;
       for (var i = 0; i < arguments.length; i++) {
           sum += (arguments[i] * this.multiplier);
       }
       return sum / arguments.length;
   }

   var x = new foo();
   x.setMultiplier(3);
   var numbers = [1, 2, 3]
   console.log(x.weightNumbers.apply(x, numbers));
Run Code Online (Sandbox Code Playgroud)

当您调用的方法.apply()需要访问实例数据时,您必须将相应的对象作为第一个参数传递,以便该方法具有正确的this指针以按预期执行其工作.