为什么"foo = foo || {};" 不行?

Chr*_*s M 4 javascript

我正在我的浏览器控制台中试验一些javascript,并且不确定为什么这不起作用.控制台和jsfiddle中的以下代码在我的尝试中抛出错误:Uncaught ReferenceError:foo未定义

foo = foo || {}; 
Run Code Online (Sandbox Code Playgroud)

我解释这个的方式是:如果全局对象的foo(在这种情况下是窗口)不存在,则将其创建为空对象.

或者,代码window.foo = window.foo || {}; 像我期望的那样工作.事先为foo分配值foo = 'bar'会使原始语句在之后运行时也能正常工作.

Ble*_*der 9

您必须先检查是否foo已定义:

foo = typeof foo !== 'undefined' ? foo : {};
Run Code Online (Sandbox Code Playgroud)

它可能有点不直观,但是未定义和具有值undefined(window.foowindow没有foo属性时返回)之间存在差异.

更好的方法是添加var关键字:

var foo = foo || {};
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为JavaScript将变量声明提升到当前范围的顶部,声明foo并赋予它一个值undefined:

var foo;

foo = foo || {};
Run Code Online (Sandbox Code Playgroud)