【发布时间】:2014-07-31 18:57:24
【问题描述】:
在 Chrome 和 Firefox 中,
typeof foo
评估为'undefined'。
但是
typeof (function() { return foo; })()
抛出错误:
ReferenceError: foo is not defined
这破坏了我对表达式可替代性的概念!直到现在,我才知道foo和(function() { return foo; })()不一样的条件。
这是标准行为吗?如果是这样,引用 ECMAScript 标准的相关部分会很有帮助。
编辑:
另一个例子:
typeof (foo)
typeof (foo + 0)
我希望 (foo) 和 (foo + 0) 会抛出错误。
但是第一个没有错误;第二个。
【问题讨论】:
-
我不确定为什么
typeof foo没有抛出ReferenceError,但函数表达式可能在return语句上抛出错误,而不是在typeof上。跨度> -
同意。您正在尝试返回未定义的内容,并且您的代码在那里引发了异常。
(function(){ return typeof foo; })()按您的想法工作。 -
@ajp15243,正确。但正如
typeof (1 + 1)首先评估1 + 1,我认为表达式foo被评估,例如到2或'hello world',并且该评估也会抛出ReferenceError。当然,事实并非如此。 -
你的匿名函数首先执行,抛出异常。当您尝试评估任何其他未定义的表达式时,也会发生同样的事情:
typeof (1 + foobar) // => ReferenceError -
@ajp15243 我明白他在说什么;如果您考虑如何评估语言,则必须先评估
foo,然后再评估typeof。也就是说,例如,如果您说alert("test"),则表达式"test"在调用alert之前进行评估,并且应该独立于警报进行评估,即alert("test")和someOtherFunction("test")不应影响常量"test"。如果这是真的,为什么typeof不独立于上下文评估foo?
标签: javascript expression language-lawyer typeof referenceerror