ck_*_*ck_ 7 javascript var scoping operator-precedence hoisting
出于好奇的好奇心,为什么javascript会接受
var z = z || [];
Run Code Online (Sandbox Code Playgroud)
初始化z(因为z可能最初定义)
但没有var,它会抛出一个错误(在全球空间)
z = z || [];
Run Code Online (Sandbox Code Playgroud)
(如果z先前未定义)
在全球空间中,您不需要使用VAR,但我得到它可能是不好的做法.
在你说这是一个重复的问题之前
注意声明"如果你在全球范围内那么没有区别."
显然,根据我的工作实例,这并非100%正确.
这是一个怪癖还是有合法的逻辑?
在我学会的时候添加答案摘要:
感谢蒂姆(见下文)我误解的关键是没有意识到这一点(javascript的基础)
var z; 如果z已经存在,则绝对没有
这就是这个表达式似乎有两种方式,如果你错误的假设"var z"总是初始化.
从左边开始,"var z"只是确保定义了z,但是如果已经存在,则实际上不会影响任何现有值.然后在右边,如果z已经存在,则使用它,否则,变量刚刚被声明(但是为空),因此它不会被使用但不会引发错误.
这是关于Javascript中这种范围和提升问题的优秀文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
非常感谢minitech和其他所有贡献者!
Ry-*_*Ry- 10
效果是正确的.var将始终立即声明其"操作数",而当您不声明它时,您的脚本会尝试使用未定义的变量并引发错误.
如果你处于全局范围,你可以分配一个不存在的变量,它将具有与声明它相同的效果,这可能是不好的做法.当然,在你的情况下,它是未定义的.话虽这么说,虽然它可能是出于好奇心,但你永远不会写
var z = z || [];
Run Code Online (Sandbox Code Playgroud)
因为这样做是没有意义的.相反,你可能会这样做:
if(!window.z) {
window.z = [];
}
Run Code Online (Sandbox Code Playgroud)
.事实上,当我在全局范围内声明事物(从来没有;))时,我会使用它,因为它使我的意图更清晰.window.something
z = z || []将抛出z范围链中没有的任何范围(全局或非全局).这样做的原因是表达式首先尝试检索z右侧调用的现有变量的值,这在不存在时是一个错误.
var z = z || []不抛出错误的原因z是在执行表达式之前创建了变量(如果它尚不存在),这种效应通常称为提升.
另一方面,为未解析的标识符(例如z = 2)分配值将在任何范围内无错误地工作(ECMAScript 5严格模式除外,禁止它和抛出).如果无法解析标识符,它将作为最终对象的属性添加到作用域链中,这是全局对象,因此给出了创建全局变量的外观.