变量声明深入学习

142 阅读2分钟

变量声明

letconst是JavaScript里相对较新的变量声明方式。

let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 

const是对let的一个增强,它能阻止对一个变量再次赋值。

  • 作用域规则var作用域 或 函数作用域:var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问。函数参数也使用函数作用域。

  • 作用域规则可能会引发一些错误:
    ① 多次声明同一个变量并不会报错。
    ② for循环会覆盖变量i,因为所有i都引用相同的函数作用域内的变量。

  • 捕获变量怪异之处

let声明

  • 块作用域 ① 当用let声明一个变量,它使用的是词法作用域或块作用域。
    ② 不同于使用 var声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的块或for循环之外是不能访问的。
    ③ 不能在被声明之前读或写。
    虽然这些变量始终“存在”于它们的作用域里,但在直到声明它的代码之前的区域都属于

    暂时性死区。

  • **重定义及屏蔽
    **① 使用var声明时,它不在乎你声明多少次;你只会得到1个。
    ② 块级作用域变量需要在明显不同的块里声明。
    ③ 在一个嵌套作用域里引入一个新名字的行为称做屏蔽

    通常来讲应该避免使用屏蔽,因为我们需要写出清晰的代码。 

  • **块级作用域变量的获取
    **① 获取用var声明的变量时,每次进入一个作用域时,它创建了一个变量的 环境。 就算作用域内代码已经执行完毕,这个环境与其捕获的变量依然存在。
    ② 当let声明出现在循环体里时拥有完全不同的行为。 不仅是在循环里引入了一个新的变量环境,而是针对每次迭代都会创建这样一个新作用域。 

const声明

拥有与 let相同的作用域规则,但是不能对它们重新赋值。

let vs. const

使用选择:依情况而定。
使用最小特权原则,所有变量除了你计划去修改的都应该使用const。
基本原则就是如果一个变量不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量重新赋值。
使用 const也可以让我们更容易的推测数据的流动。