Skip to content

动态执行JS代码

eval

js
var a = 1;

/**
 * 执行器
 * @param {string} code 要执行的代码
 */
function exec(code) {
    var a = 2;
    eval(code);
}

exec('console.log("a", a)');
console.log('sync');

// 控制台输出
// a 2
// sync

这种方式是同步执行js代码,作用域是局部作用域

setTimeout

js
var a = 1;

/**
 * 执行器
 * @param {string} code 要执行的代码
 */
function exec(code) {
    var a = 2;
    // setTimeout函数第一个参数除了可以传入一个函数之外,
    // 也是可以传入一个字符串的,传入字符串时setTimeout会将该字符串做为js代码去执行
    setTimeout(code);
}

exec('console.log("a", a)');
console.log('sync');

// 控制台输出
// sync
// a 1

这种方式是异步执行js代码,作用域是全局作用域

script标签

js
var a = 1;

/**
 * 执行器
 * @param {string} code 要执行的代码
 */
function exec(code) {
    var a = 2;
    const $script = document.createElement('script');
    $script.innerHTML = code;
    document.body.appendChild($script);
}

exec('console.log("a", a)');
console.log('sync');

// 控制台输出
// a 1
// sync

这种方式是同步执行js代码,作用域是全局作用域。不过使用这种方式,会创建一个script标签。

Function

js
var a = 1;

/**
 * 执行器
 * @param {string} code 要执行的代码
 */
function exec(code) {
    var a = 2;
    // 创建一个函数并立即执行
    new Function(code)();
}

exec('console.log("a", a)');
console.log('sync');

// 控制台输出
// a 1
// sync

这种方式是同步执行js代码,作用域是全局作用域




不管使用哪种方式,都不推荐动态执行js代码,除非是逼的没办法了,这种做法一是效率的问题,二是安全性很堪忧啊,除非要执行的js代码是受信任的。