在全局范围内定义变量时,为什么for循环会花费很长时间?

时间:2019-07-03 06:14:51

标签: javascript for-loop ecmascript-6

在下面的示例中,为什么var比for for循环花费更长的时间?我对此进行了一些研究,发现var由于功能范围而在全局范围内定义变量,因此在块范围内定义变量。这就是为什么' var '比'let'花费更长时间的原因,但是仍然找不到关于为什么这样的理解?

with open('1.txt', 'r+') as f:
lines = f.readlines()
empid, name = lines[1].rsplit(',')
for i in range(1, 11):
    f.write(f'{int(empid) + i},{name}')

1 个答案:

答案 0 :(得分:1)

全局变量的问题在于,编译器无法知道是否要通过“外部”函数(即在编译时不知道主体)访问内容。

例如,console.log(在理论上)可以更改varCounter(如果它是全局变量)。然后,必须将该变量存储在完整的Javascript插槽(可以包含字符串,数组,对象)中,然后从中读取以进行增量。

如果变量是局部变量,而没有捕获var,则无法访问,因此变量本身可以被优化,并且循环可以只检测模式并递增32位整数作为索引,而无需分配a完整的Javascript插槽。

如果变量是局部函数var,则情况有所不同,因为外部函数也无法访问该变量。在这种情况下,如果编译器不够聪明,则var的执行甚至比let的执行更快:原因是如果体内的变量可能被闭包捕获,则新的闭包单元必须在每次迭代时分配。 var不会发生这种情况,因为范围是整个函数(而不是for循环的主体):

 x = [];
 for (let i=0; i<10; ++) {
     x.push(()=>i);
 }
 console.log(x[4]()); // Shows 4

在上述循环中将let更改为var时,您会得到10,因为所有闭包都捕获了相同的var单元格。