ECMAScript变量是松散类型的,可以用于保存任何类型的数据。

1. var 关键字

  1. var message = "hi";
  2. message = 100; // 合法,但不推荐
  3. // 在这个例子中,变量 message 首先被定义为一个保存字符串值 hi 的变量,然后又被重写为保存了数值 100。虽然不推荐改变变量保存值的类型,但这在 ECMAScript 中是完全有效的。

虽然可以通过省略 var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。这是因为不能一下子断定省略 var 是不是有意而 为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出 ReferenceError。

  • var 声明提升
    1. function foo() {
    2. console.log(age);
    3. var age = 26;
    4. }
    5. foo(); // undefined
    6. //之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:
    7. function foo() {
    8. var age;
    9. console.log(age);
    10. age = 26;
    11. }
    12. foo(); // undefined
    13. // 这就是所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部。此外,反复多次使用 var 声明同一个变量也没有问题。

2. let 声明

3. const 声明

4. 声明风格及最佳实践