推荐的最佳实践

  1. 驼峰命名
  2. 在语句后添加分号;
  3. if语句加{}使用

    1. if(test){
    2. console.log('输出')
    3. }
  4. 不适用var,优先使用const,其次let

    关键字和保留字

    image.png

    var、let、const

    var

  5. 声明作用域 —- 函数 ,全局两种

  6. var有声明提升

let

  1. 作用域 —- 块级 {}
  2. 暂时性死区 —- 因为不会提升变量到最上面,提前就使用了,导致报错。(相当于人还没来就叫了它的名字)
  3. 全局声明也不会变成全局变量 —- 但是也要保证同一个页面不能有两个相同变量名
  4. 条件声明 —- var会提升,let不能提升,所以在条件语句中声明会导致声明失败(我不确定这个人来没来,所以就不去叫这个人的名字)

    1. <script>
    2. // 假设脚本不确定页面中是否已经声明了同名变量
    3. // 那它可以假设还没有声明过
    4. if (typeof name === 'undefined') {
    5. let name;
    6. }
    7. // name 被限制在 if {} 块的作用域内
    8. // 因此这个赋值形同全局赋值
    9. name = 'Matt';
    10. try {
    11. console.log(age); // 如果 age 没有声明过,则会报错
    12. }
    13. catch(error) {
    14. let age;
    15. }
    16. // age 被限制在 catch {}块的作用域内
    17. // 因此这个赋值形同全局赋值
    18. age = 26;
    19. </script>

    cosnt

  5. 与let其他一致

  6. 唯一不同在于,const是引用地址的定义

    1. let i = 0;
    2. for (const j = 7; i < 5; ++i) {
    3. console.log(j);
    4. }
    5. // 7, 7, 7, 7, 7
    6. /* 在for-in 和 for-of 循环中使用const */
    7. for (const key in {a: 1, b: 2}) {
    8. console.log(key);
    9. }
    10. // a, b
    11. for (const value of [1,2,3,4,5]) {
    12. console.log(value);
    13. }
    14. // 1, 2, 3, 4, 5

    练习题

    6.10-3.1、3.2、3.3(变量声明) - 图2
    6.10-3.1、3.2、3.3(变量声明) - 图3

    答:

  7. 输出hi。因为message没有使用任何标识符生命,所以会自动挂载到window上。window.message也是一样的结果。

  8. 输出Matt 和 undefined。因为用var声明的变量是全局变量,会挂载到window上的全局变量。let声明也是全局但是只是为了用于记录,不可以重复声明,也不会挂载到window上面。
  9. 输出 5 5 5 5 5。因为var是全局变量,不会形成闭包。定时器的执行是在for循环全部结束之后,这个时候的i,就是全局变量的5了。如果用let声明的话,闭包会记住每一个块在执行时的函数,会记录下每一次的变量,会输出0 1 2 3 4