16

I have a bit of JavaScript code that is specified in a configuration file on the server-side. Since I can't specify a JavaScript function in the configuration language (Lua), I have it as a string. The server returns the string in some JSON and I have the client interpret it using a clean-up function:

parse_fields = function(fields) {
    for (var i = 0; i < fields.length; ++i) {
        if (fields[i].sortType) {
            sort_string = fields[i].sortType;
            fields[i].sortType = eval(sort_string);
        }
        return fields;
    }
}; 

So basically it just evaluates sortType if it exists. The problem is that Firebug is reporting a "Syntax error" on the eval() line. When I run the same steps on the Firebug console, it works with no problems and I can execute the function as I expect. I've tried some different variations: window.eval instead of plain eval, storing the sortType as I've done above, and trying small variations to the string.

A sample value of fields[i].sortType is "function(value) { return Math.abs(value); }". Here's the testing I did in Firebug console:

>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1

and the error itself in Firebug:

syntax error
[Break on this error] function(value) { return Math.abs(value); }

The last bit that may be relevant is that this is all wrapped in an Ext JS onReady() function, with an Ext.ns namespace change at the top. But I assumed the window.eval would call the global eval, regardless of any possible eval in more specific namespaces.

Any ideas are appreciated.

6
  • 3
    Note that IE cannot eval functions. Commented May 3, 2010 at 20:24
  • try var foo = function(value) { ... } Commented May 3, 2010 at 20:26
  • @SLaks: eval works just fine for me in IE for the above string, no errors... as does eval("a = function () { return 'b'; }") -- can you clarify what you meant please? Commented May 3, 2010 at 20:36
  • @Andy: Paste javascript:alert(eval("(function() { return 4; })")) into the address bar in FF and IE. Commented May 3, 2010 at 21:07
  • 1
    To eval functions in all browsers, use eval("[function(){return 1}][0]"); See my comment on stackoverflow.com/questions/4599857/… Commented May 18, 2011 at 22:06

2 Answers 2

43

To do what you want, wrap your string in parentheses:

a = "function(value) { return Math.abs(value);}";
b = eval("("+a+")");
b(-1);
Sign up to request clarification or add additional context in comments.

6 Comments

Yep, that worked. Why are the parentheses required when Firefox executes the code outside of the Firebug interface, but not required when using the Firebug console?
I, for one, can't get it to work without the braces even in the Firebug console. I don't know why it would work for you. What version of Firebug are you using?
@Kenny Peng: I remember wondering this myself once and found this answer to a similar question: stackoverflow.com/questions/964397/…. This was my first thought when I saw the question, +1 to @jhurshman for his answer.
@Jasper: I was using Firebug 1.5.3.
@Kenny: I am using 1.5.4, so perhaps something has change. I can but guess about why it is working in your commandline, but it is probably a tricky matter anyway, seeing that the commandline is doing an eval (or something similar) on what you typed already...
|
5

The parentheses are required because they force the thing inside them to be evaluated in an expression context, where it must be a function-expression.

Without the parentheses, it could instead be a function declaration, and it seems as if it is sometimes being parsed that way - this could be the source of the odd/inconsistent behaviour you're describing.

Compare this function declaration:

function foo(arg) {}

with this function-expression:

var funcExpr = function foo(arg) {};

It also has to be a function-expression if it doesn't have a name. Function declarations require names.

So this is not a valid declaration, because it's missing its name:

function (arg) {}

but this is a valid, anonymous function-expression:

var funcExpr = function(arg) {};

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.