在javascript中使用条件操作定义变量

时间:2014-09-19 10:22:06

标签: javascript

name = name || {}抛出引用错误,而var name = name || {}有效。 javascript变量初始化如何工作?

4 个答案:

答案 0 :(得分:2)

第二个代码因JavaScript提升而起作用。

当你有

var name = name || {}

它被安排为

//moved to to top of scope
var name;

//point where you initialize it
name = name || {};

因此,当您初始化名称时,它已经被声明并且值为undefined。第一个代码没有声明名称。

答案 1 :(得分:2)

该行

var name = name || {};

真的解释如下:

// Upon entry to the scope
var name;

// Later, in step-by-step code
name = name || {}

自宣布name以来,您可以安全地获取其价值(在name右侧有=)。此时它的值为undefined,因此name = name || {}会将{}分配给它。

这里有很大的不同:

name = name || {}

...是您没有name的任何声明,因此在评估该指派的右侧时不存在。 The Horror of Implicit Globals允许您通过分配创建全局变量,但不允许您读取不存在的变量的值(但是)。

这就是为什么var的版本有效且版本没有抛出ReferenceError的原因。


旁注:我建议不要依赖隐式全局变量的恐怖。相反,总是声明你的变量(尽可能避免使用全局变量)。您可以使用JavaScript的“严格模式”将隐式全局变量的恐怖变为ReferenceError(例如,写入未知符号会变成错误而不是创建全局变量,就像读取它一样)。

答案 2 :(得分:0)

name = name || {}说"我已经有一个名为name的变量,将其设置为name{}。问题是你已经有一个名为name的变量。因此,当它跳过以查看应该设置的内容时,它会认为" aha,name ...哦等等,它没有设置"和错误。

var name = ...首先创建变量,然后开始查看它应该是什么,所以当它评估值时,它会说" aha,name ... i刚刚做到了,它没有定义。这是假的,所以它是{}"。

还有另外两种常见情况。

function a(name) { name = name || 'Joe'; }

如果name未传入(例如a()),则默认为Joe。在这种情况下,变量已经由函数定义定义,因此您不需要var

defaults = { name: 'Joe' };
options = {};

// Later on
options.name = options.name || defaults.name;

答案 3 :(得分:0)

使用var javascript时,在范围的开头定义所有可变数据。 这被称为可变悬挂。

例如,如果您有此代码:

function doStuff() {
   for (var i = 0; i < arr.lenght; i++)
      var currentItem = arr[i]
      var doSomething = function(currentItem) { ... }
   }
}

javascript执行此代码:

function doStuff() {
   var i,
       currentItem,
       doSomething;

   for (i = 0; i < arr.lenght; i++) {
      currentItem = arr[i]
      doSomething = function(currentItem) {...}
   }
}