let
let 声明的成员只会在所声明的块中生效
let 修复了变量声明提升现象
// let 声明的成员只会在所声明的块中生效 -------------------------------------------if (true) {// var foo = 'zce'let foo = 'zce'console.log(foo)}// let 修复了变量声明提升现象 --------------------------------------------// console.log(foo)// var foo = 'zce'console.log(foo)let foo = 'zce'
let 在 for 循环中的表现
// let 在 for 循环中的表现 ---------------------------------------------------for (var i = 0; i < 3; i++) {for (var i = 0; i < 3; i++) {console.log(i)}console.log('内层结束 i = ' + i)}// 0 1 2 内层结束 i = 3for (var i = 0; i < 3; i++) {for (let i = 0; i < 3; i++) {console.log(i)}console.log('内层结束 i = ' + i)}// 0 1 2 内层结束 i = 0// 0 1 2 内层结束 i = 1// 0 1 2 内层结束 i = 2// for 循环会产生两层作用域 ----------------------------------for (let i = 0; i < 3; i++) {let i = 'foo'console.log(i)}// foo foo foo// let i = 0// if (i < 3) {// let i = 'foo'// console.log(i)// }// i++// if (i < 3) {// let i = 'foo'// console.log(i)// }// i++// if (i < 3) {// let i = 'foo'// console.log(i)// }// i++
let 应用场景:循环绑定事件,事件处理函数中获取正确索引
// let 应用场景:循环绑定事件,事件处理函数中获取正确索引 -----------------------------------------------------var elements = [{}, {}, {}]for (var i = 0; i < elements.length; i++) {elements[i].onclick = function () {console.log(i)}}elements[2].onclick()//3// 闭包保存ivar elements = [{}, {}, {}]for (var i = 0; i < elements.length; i++) {elements[i].onclick = (function (i) {return function () {console.log(i)}})(i)}elements[0].onclick()//0elements[0].onclick()//0elements[1].onclick()//1// 使用let绑定var elements = [{}, {}, {}]for (let i = 0; i < elements.length; i++) {elements[i].onclick = function () {console.log(i)}}elements[1].onclick()//1
const
const声明的成员只会在所声明的块中生效
const声明的变量变量值无法被修改,对于数据成员的修改是没有问题的
// const name = 'zce'// 恒量声明过后不允许重新赋值// name = 'jack'// 恒量要求声明同时赋值// const name// name = 'zce'// 恒量只是要求内层指向不允许被修改// const obj = {}// 对于数据成员的修改是没有问题的// obj.name = 'zce'// obj = {}if (1 < 3) {const a = 2}console.log(a)
