这两个关键字在范围方面的区别已经被彻底讨论过here,但我想知道两者之间是否存在任何性能差异,如果有,它是否可以忽略不计,或者在什么时候会变得显着?
After testing this on http://jsperf.com, I got the following results: jsperf has been down for a while; see the replacing code below.
为了检查这一点,我将使用以下基于的性能测试这个答案,这促使我编写了这个函数:
/**
* Finds the performance for a given function
* function fn the function to be executed
* int n the amount of times to repeat
* return array [time for n iterations, average execution frequency (executions per second)]
*/
function getPerf(fn, n) {
var t0, t1;
t0 = performance.now();
for (var i = 0; i < n; i++) {
fn(i)
}
t1 = performance.now();
return [parseFloat((t1 - t0).toFixed(3)), parseFloat((repeat * 1000 / (t1 - t0)).toFixed(3))];
}
var repeat = 100000000;
var msg = '';
//-------inside a scope------------
var letperf1 = getPerf(function(i) {
if (true) {
let a = i;
}
}, repeat);
msg += '<code>let</code> inside an if() takes ' + letperf1[0] + ' ms for ' + repeat + ' iterations (' + letperf1[1] + ' per sec).<br>'
var varperf1 = getPerf(function(i) {
if (true) {
var a = i;
}
}, repeat);
msg += '<code>var</code> inside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'
//-------outside a scope-----------
var letperf2 = getPerf(function(i) {
if (true) {}
let a = i;
}, repeat);
msg += '<code>let</code> outside an if() takes ' + letperf2[0] + ' ms for ' + repeat + ' iterations (' + letperf2[1] + ' per sec).<br>'
var varperf2 = getPerf(function(i) {
if (true) {}
var a = i;
}, repeat);
msg += '<code>var</code> outside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'
document.getElementById('out').innerHTML = msg
<output id="out" style="font-family: monospace;white-space: pre-wrap;"></output>
在 Chrome 和 Firefox 中测试后,这表明let
比var
,但仅当位于与函数主作用域不同的作用域内时。在主要范围内,var
and let
性能上大致相同。在 IE11 和 MS Edge 中,let
and var
两种情况下的性能大致相同。
按蓝色大按钮即可在您最喜欢的浏览器中亲自查看。
现在let
has 仅较新的浏览器支持,但较旧的浏览器仍然被相对较多地使用,这将是通常不使用它的一个原因。如果您想在旧浏览器无法正常工作的地方使用它,那么它应该没有问题。
Edit:由于 jsperf 不起作用,因此修改了答案(请参阅旧版本的修订历史记录)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)