Javascript &引用;x=x | | 4“;生成`ReferenceError:x未定义`error
为什么Javascript &引用;x=x | | 4“;生成`ReferenceError:x未定义`error,javascript,Javascript,为什么x=x | | 4甚至x=(x | | 5)生成ReferenceError:x未定义error,但var x=x | | 4按预期工作?您正在尝试使用一个以前未声明的变量。这会导致引用错误 [编辑] 这么多错字 [exit]@grc做对了。x=x | | 4表示在变量x中赋值x或4。 如果x为空,则将4分配给变量x 可能是您没有声明x变量。这就是为什么没有定义x 如果您尝试以下操作,它将起作用: var x; x=x||4; alert(x); 这也将有助于: x=x||4; var
x=x | | 4
甚至x=(x | | 5)
生成ReferenceError:x未定义error,但var x=x | | 4
按预期工作?您正在尝试使用一个以前未声明的变量。这会导致引用错误
[编辑]
这么多错字
[exit]@grc做对了。x=x | | 4
表示在变量x中赋值x或4。
如果x为空,则将4分配给变量x
可能是您没有声明x
变量。这就是为什么没有定义x
如果您尝试以下操作,它将起作用:
var x;
x=x||4;
alert(x);
这也将有助于:
x=x||4;
var x;
alert(x);
这是因为变量声明首先被处理(提升)。这本书很好地解释了这一点:
因为变量声明(以及一般的声明)是
在执行任何代码之前处理,在任何地方声明变量
在代码中,这相当于在顶部声明它。这也意味着
一个变量在声明之前可以被使用。这
行为称为“提升”,因为变量
声明移动到函数或全局代码的顶部
因此,以下措施也将起作用:
x=x | | 4;
var x;
x=x
是赋值操作,而不是比较so,为什么x=(x | | 5)
会产生错误?另外,我不想使用var
,应该全局声明变量。因为解析器不知道变量x
,试图访问它的值会抛出ReferenceError
。如果您确实想使用全局变量,请使用window.x=window.x | | 4
语法。请注意x=window.x | | 4
在非严格模式下可以正常工作,但在严格模式下会抛出错误。是的@raina77ow是正确的。但是如果可能的话,应该避免使用这样的全局变量。x=5
不会产生错误,那么为什么x=x | | 3
会产生错误,而在这两个语句中x
都没有事先声明。事实上,对我来说,x=x | | 3
和x=window.x | | 3
似乎是等价的。