function sum (a, b, c, d) {
return a+b+c+d;
}
var result = 0;
var start = new Date().getTime();
for (var i = 0; i < 10000000; i++) {
result = sum.call(window, 1,2,3,4); // 2446 ms
//result = sum.call(null, 1,2,3,4); // 260 ms
}
var dur = new Date().getTime() - start;
alert(dur);
在非严格模式代码中,null和undefined将替换为全局对象(即浏览器中的window对象)。
这个问题就像上面的代码一样,为什么sum.call(null,1,2,3,4)的运行速度比sum.call(window,1,2,3,4)快得多?
答案 0 :(得分:3)
不只是使用窗口范围调用,使用任何具有大量成员和属性的范围调用都会导致更长的时间。
根据ECMA 262 v5, 10.4.3调用null将导致函数的this指针绑定到全局。
这将缩短时间:
function sum (a, b, c, d) {
return a+b+c+d;
}
var result = 0;
var start = new Date().getTime();
for (var i = 0; i < 10000000; i++) {
result = sum.call({}, 1,2,3,4); //nearly half of the time(1607ms) which null costs(3478ms) for me.
}
var dur = new Date().getTime() - start;
alert(dur);
答案 1 :(得分:0)
sum.call(null, 1,2,3,4);
或sum.call(window, 1,2,3,4);
两者都是一样的......你将在this
作为参考函数进入函数。
sum.call(null, 1,2,3,4);
function sum (a, b, c, d) {
console.log(this); // null in this variable
return a+b+c+d;
}
如果您需要在函数中使用ref
,请在.call()
函数中传入第一个参数。
根据您提出的问题sum.call(null, 1,2,3,4);
会很快,因为window
ref始终是null
的大尺寸,您已在循环中作为函数ref
传递
更高效的是直接调用函数
sum(1,2,3,4)
因为它排除了从函数调用中减少一个全局ref对象。