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)
在此處閱讀有關窗口對象和全局函數的更多信息。
添加回答
舉報