首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >call(null)和call(window)的效率

call(null)和call(window)的效率
EN

Stack Overflow用户
提问于 2014-12-03 18:18:04
回答 2查看 63关注 0票数 3
代码语言: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将被替换为全局对象(即浏览器中的窗口对象)。

问题来了,就像上面的代码一样,为什么sum.call(null,1,2,3,4)比sum.call(window,1,2,3,4)运行得更快?

EN

回答 2

Stack Overflow用户

发布于 2014-12-03 18:26:50

不仅仅是用窗口作用域调用,用任何有很多成员和属性的作用域调用都会导致更长的时间。

根据ECMA 262 v5, 10.4.3,使用null调用将导致函数的this指针绑定到全局。

这将缩短时间:

代码语言: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({}, 1,2,3,4); //nearly half of the time(1607ms) which null costs(3478ms) for me.
}

var dur = new Date().getTime() - start;
alert(dur);
票数 3
EN

Stack Overflow用户

发布于 2014-12-03 18:25:49

sum.call(null, 1,2,3,4);sum.call(window, 1,2,3,4);都是一回事……您将在this中作为引用在函数中获取。

代码语言:javascript
复制
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 的总是很大

更有效的方法是直接调用函数,因为

代码语言:javascript
复制
sum(1,2,3,4) 

因为它从函数调用中排除了reduce一个全局引用对象。

Speed test results demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27269018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档