调用(null)和调用(窗口)的效率

时间:2014-12-03 10:18:04

标签: javascript

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)快得多?

2 个答案:

答案 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对象。

Speed test results demo

enter image description here