动态执行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代码是受信任的。