let

let 声明的成员只会在所声明的块中生效
let 修复了变量声明提升现象

  1. // let 声明的成员只会在所声明的块中生效 -------------------------------------------
  2. if (true) {
  3. // var foo = 'zce'
  4. let foo = 'zce'
  5. console.log(foo)
  6. }
  7. // let 修复了变量声明提升现象 --------------------------------------------
  8. // console.log(foo)
  9. // var foo = 'zce'
  10. console.log(foo)
  11. let foo = 'zce'

let 在 for 循环中的表现

  1. // let 在 for 循环中的表现 ---------------------------------------------------
  2. for (var i = 0; i < 3; i++) {
  3. for (var i = 0; i < 3; i++) {
  4. console.log(i)
  5. }
  6. console.log('内层结束 i = ' + i)
  7. }
  8. // 0 1 2 内层结束 i = 3
  9. for (var i = 0; i < 3; i++) {
  10. for (let i = 0; i < 3; i++) {
  11. console.log(i)
  12. }
  13. console.log('内层结束 i = ' + i)
  14. }
  15. // 0 1 2 内层结束 i = 0
  16. // 0 1 2 内层结束 i = 1
  17. // 0 1 2 内层结束 i = 2
  18. // for 循环会产生两层作用域 ----------------------------------
  19. for (let i = 0; i < 3; i++) {
  20. let i = 'foo'
  21. console.log(i)
  22. }
  23. // foo foo foo
  24. // let i = 0
  25. // if (i < 3) {
  26. // let i = 'foo'
  27. // console.log(i)
  28. // }
  29. // i++
  30. // if (i < 3) {
  31. // let i = 'foo'
  32. // console.log(i)
  33. // }
  34. // i++
  35. // if (i < 3) {
  36. // let i = 'foo'
  37. // console.log(i)
  38. // }
  39. // i++

let 应用场景:循环绑定事件,事件处理函数中获取正确索引

  1. // let 应用场景:循环绑定事件,事件处理函数中获取正确索引 -----------------------------------------------------
  2. var elements = [{}, {}, {}]
  3. for (var i = 0; i < elements.length; i++) {
  4. elements[i].onclick = function () {
  5. console.log(i)
  6. }
  7. }
  8. elements[2].onclick()//3
  9. // 闭包保存i
  10. var elements = [{}, {}, {}]
  11. for (var i = 0; i < elements.length; i++) {
  12. elements[i].onclick = (function (i) {
  13. return function () {
  14. console.log(i)
  15. }
  16. })(i)
  17. }
  18. elements[0].onclick()//0
  19. elements[0].onclick()//0
  20. elements[1].onclick()//1
  21. // 使用let绑定
  22. var elements = [{}, {}, {}]
  23. for (let i = 0; i < elements.length; i++) {
  24. elements[i].onclick = function () {
  25. console.log(i)
  26. }
  27. }
  28. elements[1].onclick()//1

const

const声明的成员只会在所声明的块中生效
const声明的变量变量值无法被修改,对于数据成员的修改是没有问题的

  1. // const name = 'zce'
  2. // 恒量声明过后不允许重新赋值
  3. // name = 'jack'
  4. // 恒量要求声明同时赋值
  5. // const name
  6. // name = 'zce'
  7. // 恒量只是要求内层指向不允许被修改
  8. // const obj = {}
  9. // 对于数据成员的修改是没有问题的
  10. // obj.name = 'zce'
  11. // obj = {}
  12. if (1 < 3) {
  13. const a = 2
  14. }
  15. console.log(a)