7

出于求知欲,为什么 javascript 接受

var z = z || [];

初始化 z(如 z 最初定义的那样)

但没有 var,它会引发错误(在全局空间中)

z = z || [];

(如果 z 以前未定义)

在全局空间中,您不需要使用 VAR,尽管我知道这可能是不好的做法。

在你说这是重复的问题之前

var 关键字的用途是什么以及何时使用它(或省略它)?

请注意“如果您在全局范围内,则没有区别”的声明。

鉴于我的工作示例,显然这不是 100% 正确的。

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


添加我所学的答案摘要:

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

变量 z; 如果 z 已经存在,则什么都不做

如果您错误地假设“var z”总是初始化,这就是这个表达式似乎有两种方式的方式。

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

这是一篇关于 Javascript 中这种范围界定和提升问题的优秀文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

非常感谢 minitech 和其他所有做出贡献的人!

4

3 回答 3

10

效果是对的。var将始终立即声明其“操作数”,而当您不声明它时,您的脚本会尝试使用未定义的变量并引发错误。

如果您在全局范围内,您可以分配给一个不存在的变量,它将与声明它具有相同的效果,这可能是不好的做法。当然,在您的情况下,它是未定义的。话虽如此,尽管可能出于求知欲,但您永远不会

var z = z || [];

因为这样做没有任何意义。相反,您可能会这样做:

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

. 实际上,当我在全局范围内声明事物时(从不;)),我会使用它,因为它使我的意图更加清晰。window.something

于 2012-01-30T16:04:55.803 回答
6

z = z || []z将抛出范围链中没有的任何范围(全局或非全局) 。这样做的原因是表达式首先尝试检索在z右侧调用的现有变量的值,当不存在时这是一个错误。

var z = z || []不抛出错误的原因z是在执行表达式之前创建了变量(如果它不存在),这种效果通常称为提升

另一方面,将值分配给未解析的标识符(例如z = 2)将在任何范围内正常工作(ECMAScript 5 严格模式除外,该模式禁止并抛出)。如果无法解析标识符,它将作为最终对象的属性添加到作用域链中,即全局对象,因此看起来像是创建了一个全局变量。

于 2012-01-30T16:34:15.660 回答
4

您可以分配给未声明的变量z = 123;但是,您可能不会尝试阅读可以执行的z = z || []操作。

于 2012-01-30T16:08:10.123 回答