【发布时间】:2012-09-16 03:48:22
【问题描述】:
为什么这段代码会抛出错误?
// global non-strict code
(function eval () { 'use strict'; });
现场演示: http://jsfiddle.net/SE3eX/1/
所以,我们这里有一个命名函数表达式。我想明确指出这个函数表达式出现在非严格代码中。可以看到,它的函数体是严格的代码。
严格模式规则在这里:http://ecma-international.org/ecma-262/5.1/#sec-C
相关的项目符号是这个(它是列表中的最后一个):
在严格模式代码中使用标识符 eval 或 arguments 作为 FunctionDeclaration 或 FunctionExpression 的标识符或形式参数名称 (13.1) 是 SyntaxError。尝试使用 Function 构造函数 (15.3.2) 动态定义此类严格模式函数将引发 SyntaxError 异常。
请注意,仅当函数声明/表达式本身出现在严格的代码中时,此规则才适用,在我上面的示例中 不是。
但它仍然会抛出错误?为什么?
【问题讨论】:
-
这里只是完全猜测,但也许这与在 表达式 中,具有名称的函数实例化表达式仅绑定该名称的事实有关 within 函数;换句话说,在内部,
var声明似乎有某种神奇的方式来创建一个使用对该函数的引用进行初始化的局部变量。因此,就好像您试图在本地绑定全局符号“eval”。 -
@Pointy 好提示。我必须检查标准以确定在那种情况下到底发生了什么......
-
只有
function eval () { 'use strict'; };你会得到同样的错误信息(SyntaxError: Function name may not be eval or arguments in strict mode) -
而且这没有语法错误:
window.eval = function () { 'use strict'; };
标签: javascript theory