es6新增let命令用来声明变量,但是与var的区别是let声明的变量只在let所在的代码块里面有效[图片上传失败...(image-ecfc47-1526016908749)]
我一直很好奇的是在for循环里面使用let和var的那种神奇差别到底是怎么产生的,尤其是每次面试题里面出现这个,然后我只能回答的知其然而不知其所以然的时候,如鲠在喉,难过,好了今天看见一篇帖子嗯瞬间就明白了
- js是弱类型语言,我们可以看见变量 i 的类型会根据赋值的不同而改变
var i = 0;
(function () {
console.log(typeof i);
i = 'zb';
console.log(typeof i);
}());
console.log(i + '$$$')
// number --> 第一次在全局定义为number型
// string --> 重新赋值以后变为string类型
// zb$$$
- 但是如果是for循环呢,你会发现会有所不同
console.log(i + '****');
console.log(typeof i);
for (var i = 0; i < 3; i++) {
console.log(typeof i);
var i = 'qbc';
console.log(typeof i);
console.log(i);
}
console.log(typeof i);
console.log(i);
console.log(i + '$$$');
// undefined****
// undefined --> 初次未定义
// number --> for循环定义为number型
// string --> for循环内部修改为string型
// qbc
// number -->但是为什么在外面还是被定义为number型,这真的是一个神奇的存在@2
// NaN
// NaN$$$
undefined
- @2 网上有一种说法就是for循环设置循环变量的那个作用域是父作用域,而循环体内部是一个单独的子作用域.
网友评论