关于javascript:定义与初始化

Definition vs initialization

声明、定义和初始化有什么区别?例子:

1
2
3
4
5
6
7
8
// Is this a declaration?
var foo;

// Did I defined object in here (but it is empty)?
var foo = {};

// Now that object is initialized with some value?
var foo = {first:"number_one"};


第一个例子是声明。您已经声明了一个标识符为foo的变量。你还没有给它一个值,所以它将是undefined

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

第二个例子是声明和赋值。您已经为标识符为foo的变量分配了一个空对象文本。如评论中所述,这实际上是以下内容的缩写:

1
2
3
4
var foo;
console.log(foo); //undefined
foo = {};
console.log(foo); //Object

第三个例子是另一个声明和另一个赋值。您已经为foo分配了不同的对象文字。

编辑(见注释)

您的代码的行为略有不同,这取决于您希望每个示例作为独立程序运行,还是作为书面程序运行(一个程序)。

如果你按照上面写的那样对待:

因为JavaScript中的变量声明被提升到它们出现的范围的顶部,重新声明变量没有任何效果。所以第一行声明一个变量foo

第二行将空的对象文本赋给foo,第三行将不同的对象文本赋给foo。这两个任务都适用于同一个foo

实际发生的是:

1
2
3
var foo;
foo = {}; //No `var` keyword
foo = {first:"number_one"}; //No `var` keyword

如果您将每一行视为单独的程序:

第一个程序声明一个名为foo的变量。它的价值是undefined

第二个程序声明一个名为foo的变量,然后为其分配一个空对象文本。

第三个程序声明一个名为foo的变量,然后给它分配一个带有一个属性的对象文字。


你说得对。

1
var foo;        // Is this a declaration ?

是的,您声明有一个名为foo的变量,但没有定义foo(所以foo是未定义的)。

1
var foo = {}    // Did I defined object in here (but it is empty) ?

是的,现在你"定义"了foo…它有一个值,它不再是未定义的。var foo = 5也算作"定义"它。

1
var foo = {first:"number_one"}  // Now that object is initialized with some value ?

您可以说它是"初始化的",但这实际上只是语义。声明的"和定义的"更有意义。


当使用var foo;声明变量时,实际上可以确保它属于您定义的范围。您所称的定义和初始化实际上是一个值分配。

以下面的代码为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function () {

  // definition
  var foo;

  function assignFoo(x) {
    // assignment
    foo = x;
  }

  assignFoo(5);

  console.log(foo);

})();

也就是说,不应该总是在定义范围内分配值。但它是最常见的用例,通常使用var foo = 5完成。

就是这样。


运行以下代码:

1
2
3
4
5
6
var foo;
console.dir(foo);
var foo = {};
console.dir(foo);
var foo = {first:"number_one"};
console.dir(foo);