如何把一个字符串,当成一个 JS 代码来执行?

eval

1
2
3
4
5
6
7
8
9
10
11
var a = 1;

function exec(code) {
var a = 2;
eval(code);
}
exec("console.log("a", a)");
console.log("sync");

// a 2
// sync

eval() 函数会将传入的字符串当做 JavaScript 代码进行执行,它会返回字符串中代码的返回值。如果返回值为空,则返回 undefined。

setTimeout

1
2
3
4
5
6
7
8
9
10
var a = 1;

function exec(code) {
var a = 2;
setTimeout(code, 0);
}
exec("console.log("a", a)");

// sync
// a 1

setTimeout() 中的 code 参数是一个可选语法,它允许你包含在定时器到期后编译和执行的字符串而非函数。

script

1
2
3
4
5
6
7
8
9
10
11
12
var a = 1;

function exec(code) {
var a = 2;
const script = document.createElement('script');
script.innerHTML = code;
document.body.appendChild(script);
}
exec("console.log("a", a)");

// a 1
// sync

Function

1
2
3
4
5
6
7
8
9
10
11
var a = 1;

function exec(code) {
var a = 2;
var fn = new Function(code);
fn();
}
exec("console.log(123)");

// a 1
// sync