2012-01-30 44 views
7

出的只是知识的好奇心,为什么JavaScript的接受Javascript:z = z ||不使用VAR时,[]会抛出错误 - 为什么?

var z = z || []; 

初始化Z(如z可最初定义)

但没有变种,它抛出一个错误(在全球空间)

z = z || []; 

(如果Z先前未定义)

在全球空间,您不需要使用VAR虽然我得到它可能b不好的做法。

之前你说这是一个问题,如

What is the purpose of the var keyword and when to use it (or omit it)?

注意的声明重复“如果在全球范围内是那么有没有什么区别。”

显然这不是100%真实的,因为我的工作示例。

这是一个怪癖还是有合法的逻辑?


添加答案的总结,因为我已经学会了:

感谢Tim(见下文)的关键,我的误解并没有意识到这一点(基本的javascript)

var z;如果z已经存在,则绝对不会执行任何操作。

如果您不正确地假定“var z”总是初始化,那么这就是这种表达式似乎具有的方式。

从左侧开始,“var z”只是确保z已定义,但实际上并不影响现有值(如果已存在)。然后在右边,如果z已经存在,则使用它,如果不存在,则该变量刚刚声明(但为空),因此它不会被使用,但不会引发错误。

这是对这种确定范围和在Javascript吊装问题的一个很好的文章: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

非常感谢MiniTech移动和其他人谁贡献呢!

+2

作为一般规则:复制实际的错误信息通常比写入“抛出错误”更有帮助。 – 2012-01-30 16:04:54

回答

6

z = z || []将在范围链中没有z的地方投掷任何范围(全局或不是)。原因是表达式首先尝试检索右侧存在的名为z的变量的值,如果不存在,则该值为错误。

为什么var z = z || []不会引发错误的原因是变量z被创建(如果它不存在的话)执行表达式之前,一个效果俗称吊装

另一方面,将值分配给未解析的标识符(例如z = 2)将在任何作用域(除ECMAScript 5严格模式,禁止它和抛出)外无错误地工作。如果标识符无法解析,它将作为作用域链中最终对象的属性添加,作为全局对象,因此给出了创建全局变量的外观。

+0

啊我想我明白了。因此,“var z”首先在左侧完成,就像指示“创建一个新的z”一样,然后在右侧寻找一个“老z”。按照该顺序,“z”刚刚在左侧初始化,因此右侧的“z”不是未定义的,尽管它是空的。如果没有var,右边的“z”不只是空的,它是未定义的。嗯好吧 - 如果“var z”将它定义为新的左边,那么这段代码如何保留现有的值呢?看起来它有两种方式,左边为右边初始化,但也可以保持右边的值。 – 2012-01-30 16:52:38

+0

@ck_:是的,我认为你已经知道了,尽管术语需要注意,因为undefined是JavaScript中的一个实际值,实际上它是分配给变量的默认值(例如'var x;'创建一个名为'x'的变量,其初始值为undefined,与从未声明的不存在的'x'不同。我会去“未申报”或“不存在”。 – 2012-01-30 16:56:31

+0

@ck_:关于保留现有值,如果'z'已经存在,'var z;'什么都不做,不管它的值如何。 – 2012-01-30 17:01:00

10

效果是正确的。 var将总是立即声明它的“操作数”,而当你不声明它时,你的脚本尝试使用未定义的变量并引发错误。

如果您处于全局范围内,您可以分配给一个不存在的变量,它将具有与声明它相同的效果,这可能是错误的做法。当然,在你的情况下,它是不确定的。这是说,虽然这可能是出于好奇心,你就永远不会

var z = z || []; 

,因为它是没有意义的这样做。相反,你可能会这样做:

if(!window.z) { 
    window.z = []; 
} 

。事实上,当我在全球范围内声明事物(从来没有;))时,我使用window.something来代替它,因为它使我的意图更加清晰。

+0

**当你没有声明它时,你的脚本尝试使用未定义的变量** - 等待你说z = z访问z但var z = z不是?第二个z仍然在全局范围内,如果它在函数之外,它仍然是第一个。 (困惑) – 2012-01-30 16:43:44

+1

@ck_:不同之处在于使用'var'会导致在任何语句执行之前创建'z'变量。 – 2012-01-30 16:51:29

4

您可以指定一个未声明的变量z = 123;但是你可能不会尝试阅读z = z || []所做的一个。

相关问题