在下面的示例中,为什么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}')
答案 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
单元格。