Javascript:z=z||[]在不使用VAR时抛出错误-原因

Javascript: z = z || [] throws an error when not using VAR - why?

本文关键字:VAR 出错 错误 原因 Javascript      更新时间:2023-09-26

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

var z = z || [];

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

但如果没有var,它会抛出一个错误(在全局空间中)

z = z || [];

(如果z之前未定义)

在全球范围内,你不需要使用VAR,尽管我知道这可能是一种糟糕的做法。

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

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

请注意"如果您在全局范围内,则没有区别。"

显然,以我的工作为例,这不是100%正确的。

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


添加我所学的答案摘要:

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

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

如果您错误地假设"varz"总是初始化,那么这个表达式似乎是双向的。

从左边开始,"varz"只是确保z已定义,但如果它已经存在,则不会实际影响任何现有值。然后在右边,如果z已经存在,则使用它;如果不存在,则仅声明变量(但为空),因此不会使用它,但不会引发错误。

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

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

效果是正确的。var总是立即声明其"操作数",而当您不声明它时,脚本会尝试使用未定义的变量并抛出错误。

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

var z = z || [];

因为这样做毫无意义。相反,你可以这样做:

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

事实上,当我在全局范围(从来不是;))中声明事物时,我使用window.something,因为它使我的意图更加明确。

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

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

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

您可以为未声明的变量z = 123赋值;但是,您可能不会尝试阅读z = z || []所做的内容。