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"}; |
第一个例子是声明。您已经声明了一个标识符为
1 2 | var foo; console.log(foo); //undefined |
第二个例子是声明和赋值。您已经为标识符为
1 2 3 4 | var foo; console.log(foo); //undefined foo = {}; console.log(foo); //Object |
第三个例子是另一个声明和另一个赋值。您已经为
编辑(见注释)
您的代码的行为略有不同,这取决于您希望每个示例作为独立程序运行,还是作为书面程序运行(一个程序)。
如果你按照上面写的那样对待:
因为JavaScript中的变量声明被提升到它们出现的范围的顶部,重新声明变量没有任何效果。所以第一行声明一个变量
第二行将空的对象文本赋给
实际发生的是:
1 2 3 | var foo; foo = {}; //No `var` keyword foo = {first:"number_one"}; //No `var` keyword |
如果您将每一行视为单独的程序:
第一个程序声明一个名为
第二个程序声明一个名为
第三个程序声明一个名为
你说得对。
1 | var foo; // Is this a declaration ? |
是的,您声明有一个名为
1 | var foo = {} // Did I defined object in here (but it is empty) ? |
是的,现在你"定义"了
1 | var foo = {first:"number_one"} // Now that object is initialized with some value ? |
您可以说它是"初始化的",但这实际上只是语义。声明的"和定义的"更有意义。
当使用
以下面的代码为例:
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); })(); |
也就是说,不应该总是在定义范围内分配值。但它是最常见的用例,通常使用
就是这样。
运行以下代码:
1 2 3 4 5 6 | var foo; console.dir(foo); var foo = {}; console.dir(foo); var foo = {first:"number_one"}; console.dir(foo); |