Javascript:z=z||[]在不使用VAR时抛出错误-原因
Javascript: z = z || [] throws an error when not using VAR - why?
仅仅出于求知欲,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 || []
所做的内容。
- 控制台返回var不是't定义,但它是
- javascript中的数组出错
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- 从var向代码隐藏函数传递值
- 如何通过引用var Using DataTables来进行分页或排序
- jQuery语法添加了var
- 如何将具有文本类型值的var放入jQuery函数中
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 在Meteor项目中安装并包含npm模块后出错
- 解析JSON并从中删除对象会出错
- AngularJS指令出错-无法读取属性'编译'的未定义
- 当var==0时,我如何显示一个警报
- 使用javascript在MVC中查找网格长度时出错
- 尝试调用AngularJS上的函数时出错
- javascript中对象构造函数中的var属性与this.properties
- 函数中this和var之间的区别
- Google 脚本:用于创建日历活动的脚本运行时不会出错,但不会执行任何操作
- 从 Html 表单 Meteor javascript 获取 Var 时出错
- 如果var为空,如何修剪变量而不会出错
- 在var声明中使用if-else简写操作符时出错