如何动态执行 JS 脚本

场景

在实际的业务开发中,我们可能需要将一段字符串代码动态执行,我们看一个例子:

scss 复制代码
// 如何将字符串 code 当成 js 代码执行
function exec(code) {}

exec('console.log("Hello world")')

eval 函数

eval()函数 是一种接受字符串作为参数,并且可以将接受的字符串转换成js表达式并且立即执行该表达式。

ini 复制代码
const a = 1;
function exec(code) {
  const a = 2;
  eval(code);
}

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

// 执行结果:先输出 2,再输出 sync

特点:同步执行,其作用域为当前执行作用域

setTimeout

setTimeout 的第一个参数,可以是一个函数,也可以是一个代码串,那么我们就可以利用其特点来实现动态 js 脚本

ini 复制代码
const a = 1;
function exec(code) {
  const a = 2;
  setTimeout(code);
}

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

// 执行结果:先输出 sync,再输出 1

特点:异步执行,其作用域为全局作用域

动态 script 标签

动态script标签 方法就是我们创建一个 script 标签元素对象,将其插入到当前 Dom

ini 复制代码
const a = 1;
function exec(code) {
  const a = 2;
  var script = document.createElement('script');
  script.innerHTML = code;
  document.body.appendChild(script);
}

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

// 执行结果:先输出 1,再输出 sync

特点:同步执行,其作用域为全局作用域

new Function

所有函数方法的原型对象是 Function ,我们可以通过 new Function() 示例来生成一个方法,再执行就可动态执行 js 脚本

javascript 复制代码
const a = 1;
function exec(code) {
  const a = 2;
  new Function(code)();
}

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

// 执行结果:先输出 1,再输出 sync

特点:同步执行,其作用域为全局作用域

总结

具体的实现方案可根据当前的业务场景来选择,但是不推荐 动态script标签 ,毕竟是通过操作 Dom 实现的。

方法 同步/异步 作用域
eval 同步 当前执行作用域
setTimeout 异步 全局作用域
动态 script 标签 同步 全局作用域
new Function 同步 全局作用域
相关推荐
Jonathan Star10 小时前
沉浸式雨天海岸:用A-Frame打造WebXR互动场景
前端·javascript
老前端的功夫10 小时前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
LilySesy11 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
Wang's Blog12 小时前
前端FAQ: Vue 3 与 Vue 2 相⽐有哪些重要的改进?
前端·javascript·vue.js
用户479492835691512 小时前
JavaScript 的 NaN !== NaN 之谜:从 CPU 指令到 IEEE 754 标准的完整解密
前端·javascript
醉方休13 小时前
Web3.js 全面解析
前端·javascript·electron
前端开发爱好者13 小时前
前端新玩具:Vike 发布!
前端·javascript
今天也是爱大大的一天吖14 小时前
vue2中的.native修饰符和$listeners组件属性
前端·javascript·vue.js
fxshy14 小时前
在 Vue 3 + Vite 项目中使用 Less 实现自适应布局:VW 和 VH 的应用
前端·javascript·less
奇舞精选14 小时前
AI时代的前端知识拾遗:前端事件循环机制详解(基于 WHATWG 最新规范)
前端·javascript