作用于类型: 全局、函数、块级(花括号包裹起来的范围)三种作用域
1.let:块级作用域;变量先声明后定义;不可提升;不可重复定义同一个变量【var没有块级作用域,变量可提升】
2. const:声明常量,let基础上新增只读特性:声明了就要赋值,且值不可改变指向的内存地址【不是简单的不可修改】
最佳实践: 主用let,配合const,不用var
// 内层覆盖外层形成全局变量 内 0 内 1 内 2 外 3,如果内外层不同变量,内执行3次外执行一次 for (var i = 0; i < 3; i++) { for (var i = 0; i < 3; i++) { console.log('内', i); } console.log('外', i); } // 将内层改为let,外层无论是let还是var,都互不影响 for (var i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) { console.log('内', i); } console.log('外', i); } // 内 0 内 1 内 2 外 0 // 内 0 内 1 内 2 外 1 // 内 0 内 1 内 2 外 2 // 注:循环保存元素的数组,给其中任意元素添加点击事件 var elements = [{}, {}, {}]; for (let i = 0; i < elements.length; i++) { elements[i].onclick = function () { console.log(i); }} elements[2].onclick(); // 2 // 闭包解决:利用函数作用域摆脱全局作用域的影响 var elements = [{}, {}, {}]; for (let i = 0; i < elements.length; i++) { elements[i].onclick = ( function () { return function () { console.log(i) } } )(i) } elements[0].onclick(); // 0 // for有两层作用域,且互不影响 for (let i = 0; i < 3; i++) { let i = 'foo'; console.log(i); // 3个foo } // 声明了就要赋值,不然报错 Missing initializer in const declaration const a; a = 22; // 声明即赋值且不可修改,不然报错Assignment to constant variable. const a = 12; a = 22; // 不能改变的是内存地址:改变了对象的内存地址 const obj = {}; obj.na
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)