使用"eval"创建匿名方法 - 浏览器特定的行为

Chr*_*igl 5 javascript eval callback

我使用jQuery,我需要使用eval()函数生成一个匿名方法.

以下几行适用于Opera,但不适用于IE,FF,Chrome:

var callbackStr = "function(){alert('asdf');}";  
var callback = eval(callbackStr);  
callback();
Run Code Online (Sandbox Code Playgroud)

此代码适用于所有浏览器:

var callbackStr = "var callback = function(){alert('asdf');}";  
eval(callbackStr);  
callback();  
Run Code Online (Sandbox Code Playgroud)

你看,我已经解决了我的问题.但我想知道,到底发生了什么.任何人都可以向我解释这种行为,或告诉我在哪里可以找到更多信息?

(PS:我知道这个页面.)

And*_*y E 6

原因与在使用eval它们之前需要在JSON字符串周围括起括号的原因相同- eval视为{一个标记,语句的开始 eval假定匿名函数是一个FunctionDeclaration.使用括号允许eval将内部处理为表达式:

var callbackStr = "(function(){alert('asdf');})";  
var callback = eval(callbackStr);  
callback();
// -> alerts 'asdf';
Run Code Online (Sandbox Code Playgroud)

至于为什么Opera在这里行为不同,我不知道.至于你的使用eval,可能有更好的方法(几乎总是如此).

我在ECMA-262第3版的第12.4节中为你挖出了一个引用的引用:

请注意,ExpressionStatement不能以开括号大括号开头,因为这可能使其与Block不一致.此外,ExpressionStatement不能以function关键字开头,因为这可能使其与FunctionDeclaration不一致.

强调我的.