声明,定义和初始化之间有什么区别?例如:
// 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"};
答案 0 :(得分:5)
第一个例子是声明。您已声明了一个标识为foo
的变量。你尚未给它一个值,所以它将是undefined
:
var foo;
console.log(foo); //undefined
第二个例子是声明和作业。您已为具有标识符foo
的变量分配了一个空对象文字。正如评论中所指出的,这实际上很简短:
var foo;
console.log(foo); //undefined
foo = {};
console.log(foo); //Object
第三个例子是另一个声明和另一个作业。您已为foo
分配了不同的对象字面值。
修改(见评论)
代码的行为略有不同,具体取决于您是希望每个示例作为独立程序运行,还是作为书面(一个程序)运行。
如果您对待的内容如下:
由于JavaScript中的变量声明被提升到它们出现的作用域的顶部,因此重新声明变量无效。所以第一行声明了一个变量foo
。
第二行将空对象文字指定给foo
,第三行将不同的对象文字指定给foo
。这两项任务都适用于同一foo
。
实际发生的是:
var foo;
foo = {}; //No `var` keyword
foo = {first:"number_one"}; //No `var` keyword
如果您将每一行视为单独的程序:
第一个程序声明一个名为foo
的变量。它的值是undefined
。
第二个程序声明一个名为foo
的变量,然后为其分配一个空对象文字。
第三个程序声明一个名为foo
的变量,然后为一个对象文字指定一个属性。
答案 1 :(得分:2)
你做得对。
var foo; // Is this a declaration ?
是的,您声明有一个名为foo
的变量,但未定义foo
(因此foo
未定义)。
var foo = {} // Did I defined object in here (but it is empty) ?
是的,现在你“定义”foo
...它有一个值,它不再是未定义的。 var foo = 5
也算作“定义”它。
var foo = {first:"number_one"} // Now that object is initialized with some value ?
你可以说它是“初始化的”,但那真的只是语义。 “声明”和“定义”更有意义。
答案 2 :(得分:0)
运行以下代码:
var foo;
console.dir(foo);
var foo = {};
console.dir(foo);
var foo = {first:"number_one"};
console.dir(foo);
答案 3 :(得分:0)
当您使用var foo;
声明变量时,实际上确保它属于您定义它的范围。您所谓的定义和初始化实际上是一个值赋值。
考虑下面一段代码作为例子:
(function () {
// definition
var foo;
function assignFoo(x) {
// assignment
foo = x;
}
assignFoo(5);
console.log(foo);
})();
要说,您并不总是应该在定义范围内分配值。但它是最常见的用例,通常使用var foo = 5
完成。
多数民众赞成。