Java Script 中 for in 的 key 如果不用let 进行定义
先看如下JS代码
for (key in obj){
// 此处一些操作
}
通常,我们会将 key 使用 let 进行定义 即 for (let key in obj)
那么,如果我们不用let 进行定义会造成什么结果呢?
我们分为以下两种情况:
①key 在别处已有定义
有如下代码
for (key in obj){
alert(key);//被执行
}
alert(key);//在循环外,同样被执行
这说明,我们无意中创建了一个变量key ,并且key 的作用域不局限于for循环体中,我们在其外部也可以进行调用。
那key 的作用域具体是什么呢?
如果除了此处(for),我们在别处还定义了一个let key (或者var key)
那在for(key in obj)中,我们其实没有定义一个key,而是进行了接盘!
直观的说,如果我们之前定义了一个全局变量key,那么for循环中的key是对之前的全局变量进行沿用,for中的key,其作用域是和之前定义的key 相同的。
②key 仅在此处进行第一次声明
如①中代码所示的结果,key 在for 循环外依然可以进行调用,即使我们之前没有任何关于key 的声明
那么key 此时的作用域又是什么呢?答案:key 的作用域会顺着作用域链,一层一层向外。如此处,key 的作用域从for 向外一层,但又限制在for 的上一级作用域中,如:
function(){
for(key in obj){
}
alert(key);// key 的作用域仅限于function内部
}
在function 外,我们就不能调用key。因为超出了key的作用域。(情况①除外,情况①沿用已经定义的作用域,也就是接盘)。