前言

今天在练习 JavaScript 时遇到一个有意思的问题:

我有这样一段代码,最外层写着

1
2
var x = 10;
console.log(this.x);

当我习惯性地使用 node 命令运行这个 js 文件时,打印出了 undefined ,而非预期的 10

查阅部分资料获知原因,本篇文章用于记录此事。

Window 中的 var 声明

window 中,不使用关键字声明的变量,和在最外层声明的变量都是全局变量 window 的属性。

1
2
3
4
x = 10;
console.log(x, window.x); // 10, 10
var y = 20;
console.log(y, window.y); // 20, 20

Node 中的 var 声明

Node 中,没有全局变量 window,取而代之的是 global。关键字 this 也指向 global。声明分两种情况:

  1. REPL 中,同 window

    1
    2
    3
    4
    x = 10;
    console.log(x, this.x, global.x); // 10, 10, 10
    var y = 20;
    console.log(y, this.y, global.y); // 20, 20, 20
  2. 模块中

    1
    2
    3
    4
    5
    6
    7
    // 不使用关键字声明的变量为全局变量
    x = 10;
    console.log(x, this.x, global.x); // 10, 10, 10

    // 使用关键字声明的变量为模块私有的变量,非全局变量
    var y = 20;
    console.log(y, this.y, global.y); // 20, undefined, undefined