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将被替换为全局对象(即浏览器中的窗口对象)。
问题来了,就像上面的代码一样,为什么sum.call(null,1,2,3,4)比sum.call(window,1,2,3,4)运行得更快?
发布于 2014-12-03 18:26:50
不仅仅是用窗口作用域调用,用任何有很多成员和属性的作用域调用都会导致更长的时间。
根据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);发布于 2014-12-03 18:25:49
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将会很快,因为您在循环中作为函数传递的 null 的总是很大
更有效的方法是直接调用函数,因为
sum(1,2,3,4) 因为它从函数调用中排除了reduce一个全局引用对象。
Speed test results demo

https://stackoverflow.com/questions/27269018
复制相似问题