为什么要将“null”传递给“apply”或“call”?
当您没有希望指定的值时this
函数内的指针和您正在调用的函数不需要特定的this
值才能正常运行。
显式传递关键字 this 不是更清晰吗?或者至少
更具人类可读性。那么此时我可能不明白为什么
你会使用 null。
在您的具体情况下,最好的选择可能是Math
object:
function getMax(arr){
return Math.max.apply(Math, arr);
}
虽然事实证明你传递什么作为第一个参数并不重要Math.max.apply(...)
(仅因为实施细节Math.max()
),通过Math
设置this
指向与正常调用它时设置的完全相同的东西,例如Math.max(1,2,3)
所以这是最安全的选择,因为你最好模拟正常的调用Math.max()
.
为什么要将“null”传递给“apply”或“call”?
以下是更多详细信息...使用时.call()
or .apply()
, null
当您没有要设置的特定值时可以传递this
指针,并且您知道您正在调用的函数不是预期的this
具有任何特定值(例如,它不使用this
在其实施中)。
注意:使用null
with .apply()
or .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));
当你调用的方法.apply()
如果需要访问实例数据,那么您必须传递适当的对象作为第一个参数,以便该方法具有正确的this
指针按预期完成其工作。