要定义变量,可以使用 var 操作符,后跟变量名:

  1. var message;
  2. console.log(message); //undefined

var 声明作用域

var 操作符定义的变量会成为包含它的函数的局部变量。
比如,使用 var在一个函数内部定义一个变量,就意味着该变量将在函数退出时被销毁:

  1. function test() {
  2. var message = "hi"; // 局部变量
  3. }
  4. test();
  5. console.log(message); // 出错!

这里,message 变量是在函数内部使用 var 定义的。函数叫 test(),调用它会创建这个变量并给它赋值。调用之后变量随即被销毁,因此示例中的最后一行会导致错误。
不过,在函数内定义变量时省略 var 操作符,可以创建一个全局变量:

  1. function test() {
  2. message = "hi"; // 全局变量,不推荐
  3. }
  4. test();
  5. console.log(message); // "hi"

去掉之前的 var 操作符之后,message 就变成了全局变量。只要调用一次函数 test(),就会定义这个变量,并且可以在函数外部访问到。

var 声明提升

使用 var 时,下面的代码不会报错。这是因为使用这个关键字声明的变量会自动提升到函数作用域顶部:

  1. function foo() {
  2. console.log(age);
  3. var age = 26;
  4. }
  5. foo(); // undefined

之所以不会报错,是因为 ECMAScript 运行时把它看成等价于如下代码:

  1. function foo() {
  2. var age;
  3. console.log(age);
  4. age = 26;
  5. }
  6. foo(); // undefined

这就是所谓的“提升”(hoist),也就是把所有变量声明都拉到函数作用域的顶部。

var 反复多次声明同一个变量

反复多次使用 var 声明同一个变量也没有问题:

  1. function foo() {
  2. var age = 16;
  3. var age = 26;
  4. var age = 36;
  5. console.log(age);
  6. }
  7. foo(); // 36