4 回答

TA贡献1805条经验 获得超9个赞
好吧,10个循环乘以1亿次操作给出了这个(铬):
您可以注意到,在第2行,它进行了一些优化并开始更快地运行。其他差异可以忽略不计。
for( let j = 0; j < 10; j++ ) {
let start1 = performance.now();
let x1 = 0;
for( let i = 0; i < 1e8; i++ ) {
x1 += foo();
}
let end1 = ( performance.now() - start1 ).toFixed(10);
/***/
let start2 = performance.now();
let x2 = 0;
for( let i = 0; i < 1e8; i++ ) {
x2 += window["foo"]();
}
let end2 = ( performance.now() - start2 ).toFixed(10);
console.log("foo():", end1, " // window: ", end2);
}
/***/
function foo() {
return 1;
}
.as-console-wrapper { max-height: 100vh !important; }

TA贡献1804条经验 获得超3个赞
我真的希望没有区别,但我看到测试的时间是2倍,或者这个简单的加法测试:NO_WINDOWWINDOW_STRINGWINDOW_PROPERTY
add = (a,b) => a+b;
console.time('NO_WINDOW');
for (var i = 0; i < 1000; i++);
add(i, i+1);
console.timeEnd('NO_WINDOW');
console.time('WINDOW_STRING');
for (var i = 0; i < 1000; i++);
window['add'](i, i+1);
console.timeEnd('WINDOW_STRING');
console.time('WINDOW_PROPERTY');
for (var i = 0; i < 1000; i++);
window.add(i, i+1);
console.timeEnd('WINDOW_PROPERTY');
编辑:Phil在评论中指出,这似乎是一个奇怪的问题,其中第一个调用总是比后续调用花费更长的时间。console.timeEnd
使用和适当的基准测试逻辑进行重现,在性能上没有显著的差异:performance.now()
add = (a,b) => a+b;
avg = (arr) => arr.reduce(add) / arr.length;
let noWindow = [],
windowProp = [],
windowString = [],
n = 1e6,
start;
start = performance.now();
for (var i = 0; i < n; i++)
window.add(i, i+1);
windowProp.push(performance.now() - start);
start = performance.now();
for (var i = 0; i < n; i++)
add(i, i+1);
noWindow.push(performance.now() - start);
start = performance.now();
for (var i = 0; i < n; i++)
window['add'](i, i+1);
windowString.push(performance.now() - start);
let avgs = [
avg(noWindow),
avg(windowString),
avg(windowProp)
];
console.log(avgs);

TA贡献1835条经验 获得超7个赞
假设它们是等效的引用,似乎唯一的区别在于变量的读取方式。众所周知,在使用方括号读取全局或对象属性时,浏览器在历史的不同时间点存在性能差异。
如果存在这样的差异,那将是微不足道的,几乎从来都不是问题。
我唯一想知道的是,某些浏览器是否会失去对动态访问的键和/或全局变量的优化。它是一个全局函数,并且使用动态访问该属性的语法,该函数可能无法通过引擎进行完全优化。
同样,可能不是你应该关心的事情,除非它是一个非常沉重的功能,并且通常运行起来相当昂贵。

TA贡献2037条经验 获得超6个赞
根据你调用它的上下文,它是一回事。在浏览器中,基本上您可以访问窗口对象中的任何键,而无需直接引用它。因此,这些中的任何一个都是相同的:
foo(123)
window["foo"](123)
window.foo(123)
在此处阅读有关窗口对象和全局函数的更多信息。
添加回答
举报