dezman
dezman

Reputation: 19358

Execute JavaScript from String

So, I want to run this script when button A is clicked. The script is stored in an Object as a string. When button A is clicked, I use eval, like: eval(Object[script]). This works fine, unless I have functions within the script, when I do, it breaks because they are not getting defined. Is there a way to get around this? I tried putting the function definition in a var and putting it at the top of the script. Now, if I simply copy my script to the console, it executes perfectly. Is there a way to execute a script as if it were typed into the console?

FYI: This is a simplification of my problem, I realize there are better ways to do what I describe here.

Upvotes: 2

Views: 129

Answers (3)

cHao
cHao

Reputation: 86505

The best fix is to stop storing code as strings. Use functions instead.

buttonA.script = function() {
    do whatever you were doing in your eval
};

// then, instead of `eval(buttonA['script'])`, say...
buttonA.script();

// or, if the name is in a variable...
var foo = 'script'; // for example
buttonA[foo]();

About the only time eval makes sense is when you have code that by its very nature has to be dynamically generated or interpreted. For the vast majority of cases, that is not true. I can only think of a case where it would be true, in fact: the textarea script testing thing mentioned in the comments.

For every other case...

obj = {
    first: function() {
        function test() { alert('hi'); }
        test();
    }
};

obj['first']();
// or simply
obj.first();

// and what's more...`test` doesn't escape and trample on stuff.
try { test(); }
catch (ex) { alert("" + ex); }  says `test` is not defined

Upvotes: 2

The Alpha
The Alpha

Reputation: 146191

In your code alert(hi) should be alert("hi")

obj = {
    first: 'function test() { alert("hi") } test();'
}
eval(obj["first"]);

DEMO.

Upvotes: 1

suff trek
suff trek

Reputation: 39777

This works:

var oFunc = function (value) {
                    alert(value)
            }

var obj = { code: "oFunc('hello')" }

eval(obj["code"]);

Or am I missing something?

Update

This also works

var obj = { code: "var oFunc = function (value) {alert(value)}; oFunc('hello')" }
eval(obj["code"]);

Upvotes: 1

Related Questions