JavaScript中for-of循环里let、const与无关键字声明的区别
JavaScript中三种for-of循环写法的差异解析
嘿,这个问题问得真细致!虽然在你给出的例子里,三种写法的输出看起来完全一致,但它们背后的变量作用域、可变性以及规范合理性差异其实挺大的,咱们逐个拆解来看:
for(const item of dd)
这里的item是块级作用域变量,每次循环迭代都会创建一个全新的item绑定。而且因为用了const,在当前迭代过程中你不能给item重新赋值(比如写item = 10会直接抛出语法错误)。这种写法是ES6推荐的首选,尤其适合不需要修改循环变量的场景,能从语法层面避免意外的赋值错误,让代码更健壮。for(let item of dd)
和const版本一样,item也是块级作用域,每次循环也会生成新的绑定。但区别在于,你可以在循环内部修改item的值,比如item = 10是合法的。不过要注意,修改的只是当前迭代的item变量,不会影响原数组里的元素,也不会干扰下一次循环的item值。这种写法适合你确实需要在循环内临时修改循环变量的场景。for(item of dd)
这个写法没有用let或const声明变量,这是个很危险的操作:- 如果是在全局作用域中执行,
item会被隐式创建成全局变量,循环结束后你依然能访问到它,此时它的值是数组的最后一个元素(也就是5);而前两种写法的item在循环结束后就会因为块级作用域销毁而无法访问。 - 如果是在函数内部,JS会向上层作用域查找名为
item的变量,找不到的话同样会隐式创建全局变量。这种行为很容易导致变量污染,比如其他地方的同名变量会被意外覆盖,引发难以排查的bug。 - 另外,在严格模式(
'use strict')下,这种无声明的写法会直接抛出错误,因为严格模式禁止隐式创建全局变量。
- 如果是在全局作用域中执行,
总的来说,前两种是符合ES6规范的现代写法,根据是否需要修改循环变量选择const或let;而第三种无声明的写法是不推荐的陋习,会带来各种潜在问题,一定要避免使用。
内容的提问来源于stack exchange,提问作者samuelbrody1249
相关产品推荐
相关产品推荐

