【问题标题】:Definition vs initialization定义与初始化
【发布时间】:2012-02-26 12:07:33
【问题描述】:

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

// 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"};

【问题讨论】:

  • 如果您用您使用的语言标记问题会有所帮助

标签: javascript initialization declaration definition


【解决方案1】:

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

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

第二个例子是声明和赋值。您已将一个空对象文字分配给标识符为 foo 的变量。如 cmets 所述,这实际上是以下简称:

var foo;
console.log(foo); //undefined
foo = {};
console.log(foo); //Object

第三个例子是另一个声明和另一个赋值。您已将不同的对象字面量分配给 foo

编辑(参见 cmets)

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

如果你按原样对待:

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

第二行给foo分配一个空的对象字面量,第三行给foo分配一个不同的对象字面量。这两个分配都适用于同一个foo

实际发生的情况是这样的:

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

如果你把每一行当作一个单独的程序:

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

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

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

【讨论】:

  • 最后两个也是声明。 var a = b;var a; a = b; 的简写。
  • @pimvdb - 非常真实,我没有注意到在第二个和第三个例子中使用了var(我假设第一个例子是声明foo,同样的foo在其他示例中重复使用)。
  • @pimvdb - 实际上,这不仅仅是一项任务吗?重新声明 foo 不会有任何效果(因为声明被提升了),所以在初始声明之后的 foo 的任何“声明”都不是真正的声明,而只是分配。当然,除非您将所有 3 个示例都作为单独的程序。
  • 触摸。如果语句都在一个函数中运行,那么最后两个vars 无效。
【解决方案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 ?

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

【讨论】:

    【解决方案3】:

    运行以下代码:

    var foo;
    console.dir(foo);
    var foo = {};
    console.dir(foo);
    var foo = {first:"number_one"};
    console.dir(foo);
    

    【讨论】:

      【解决方案4】:

      当你用var foo; 声明一个变量时,你实际上确保它属于你定义它的范围。你所谓的定义和初始化,其实就是赋值。

      以以下代码为例:

      (function () {
      
        // definition
        var foo;
      
        function assignFoo(x) {
          // assignment
          foo = x;
        }
      
        assignFoo(5);
      
        console.log(foo);
      
      })();
      

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

      就是这样。

      【讨论】:

        猜你喜欢
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        相关资源
        最近更新 更多