如何动态执行 JS 脚本

简介: 这篇文章介绍了在业务开发中动态执行JS脚本的几种方法,包括使用eval()函数、setTimeout、动态创建script标签以及使用Function构造函数。这些方法各有特点,如eval()同步执行且作用域为当前执行作用域,动态script标签同步执行且作用域为全局作用域等,具体实现方案需根据业务场景选择。

场景

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

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

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

eval 函数

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

const a = 1;
function exec(code) {
  const a = 2;
  eval(code);
}

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

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

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

setTimeout

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

const a = 1;
function exec(code) {
  const a = 2;
  setTimeout(code);
}

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

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

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

动态 script 标签

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

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 脚本

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 同步 全局作用域
相关文章
|
存储 XML Java
Flowable工作流-高级篇
Flowable工作流-高级篇
9971 1
|
缓存 安全 Java
|
安全 Java 应用服务中间件
使用OkHttp工具时Authorization请求头丢失问题
记一次联调三方接口时"Authorization"请求头丢失问题, 使用工具OkHttp
使用OkHttp工具时Authorization请求头丢失问题
|
11月前
|
资源调度
Vue3 + Vite 构建组件库发布到 npm
这篇文章介绍了如何使用Vue3和Vite构建组件库并发布到npm,包括初始化项目、配置项目结构、创建组件目录、设置入口文件以及导出组件等步骤。
1355 0
Vue3 + Vite 构建组件库发布到 npm
|
11月前
|
JavaScript API 开发者
JS 分片任务的高阶函数封装
这篇文章介绍了在实际业务开发中,如何处理渲染大量元素导致的页面卡顿问题。文章通过问题复现,分析了浏览器渲染原理,并提出了使用分片任务执行的方法。文章详细介绍了如何使用requestIdleCallback API实现分片任务,并封装成高阶函数,以便开发者针对不同任务进行自定义分片处理。同时,文章也涉及了浏览器渲染原理和requestIdleCallback API的用法。
198 0
|
前端开发 JavaScript 应用服务中间件
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
跨域问题是前端开发中常见且棘手的问题,但通过理解CORS的工作原理并应用合适的解决方案,如服务器设置CORS头、使用JSONP、代理服务器、Nginx配置和浏览器插件,可以有效地解决这些问题。选择合适的方法可以确保应用的安全性和稳定性,并提升用户体验。
9478 90
|
JavaScript 前端开发
在JavaScript中如何获取时间戳?
在JavaScript中如何获取时间戳?
1197 0
|
12月前
|
人工智能 自然语言处理 机器人
RPA和按键精灵有什么区别?
在数字时代,RPA与按键精灵虽都实现自动化,但本质差异显著。按键精灵依赖屏幕像素模拟操作,适合简单重复任务;而RPA通过系统集成与对象识别,胜任复杂业务流程,具备高适应性、智能扩展与企业级管理能力。二者适用场景不同,选择关键在于匹配实际需求。
617 0
RPA和按键精灵有什么区别?
|
移动开发 Serverless 异构计算
函数计算操作报错合集之Reserve resource exceeded limit 通常出现在什么情况下
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
543 0