I working with jQuery and i needed to generate an anonymous method with the eval() function.
The following lines worked with Opera but not with IE, FF, Chrome:
var callbackStr = "function(){alert('asdf');}";
var callback = eval(callbackStr);
callback();
This code works with all Browsers:
var callbackStr = "var callback = function(){alert('asdf');}";
eval(callbackStr);
callback();
You see, I already solved my problem. But I want to know, what exactly is happening. Can anybody explain this behaviour to me, or tell me where i can find further information?
(PS: I know this page.)
The reason is the same as the reason you need to wrap parentheses around JSON strings before using
evalon them –eval treatseval assumes the anonymous functions is a FunctionDeclaration. Using parentheses allows eval to treat what’s inside as an expression:{as a token, the start of a statementAs for why Opera behaves differently here, I have no idea. As for your use of
eval, there’s probably a better way (there nearly always is).I dug out a quote from the spec for you, section 12.4 of ECMA-262 3rd Edition:
Emphasis mine.