【日常记录】【JS】动态执行JS脚本

news2024/11/20 11:38:03

文章目录

    • 1、第一种方式:eval
    • 2、第二种方式:setTimeout
    • 3、第三种方式:创建script 标签插入body
    • 4、第四种方式:创建 Function
    • 5、对比
    • 6、 参考链接

1、第一种方式:eval

语法

eval(string)

参数

  • string:一个表示 JavaScript 表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    var blockName = 'window作用域'
    function exec(jsCode) {
      var blockName = '函数作用域'
      eval(jsCode)
    }

    exec(`
      console.log('动态执行脚本里面执行 输出blockName',blockName)
      const res = new Promise((resolve,reject)=>{
        setTimeout(()=>{
          resolve('动态执行脚本里面执行 promise 更改状态为 成功')
        },1000)
      })
      res.then(res=>{
        console.log(res)
      })
    
    `)
    console.log('动态执行代码后继续执行');

  </script>
</body>

</html>

可以看到,eval 是 同步执行,采用的 当前作用域 ,在哪执行的就引用那个作用域

2、第二种方式:setTimeout

语法

setTimeout(code)
setTimeout(code, delay)

setTimeout(functionRef)
setTimeout(functionRef, delay)
setTimeout(functionRef, delay, param1)
setTimeout(functionRef, delay, param1, param2)
setTimeout(functionRef, delay, param1, param2, /* … ,*/ paramN)

参数

  • functionRef:当定时器到期后,将要执行的 function
  • code:一个可选语法,允许你包含在定时器到期后编译和执行的字符串而非函数
  • delay:延迟时间,可选,单位是毫秒
    var blockName = 'window作用域'
    function exec(jsCode) {
      var blockName = '函数作用域'
      // eval(jsCode)
      setTimeout(jsCode)
    }

    exec(`
      console.log('动态执行脚本里面执行 输出blockName',blockName)
      const res = new Promise((resolve,reject)=>{
        setTimeout(()=>{
          resolve('动态执行脚本里面执行 promise 更改状态为 成功')
        },1000)
      })
      res.then(res=>{
        console.log(res)
      })
    
    `)
    console.log('动态执行代码后继续执行');

在这里插入图片描述

可以看到 setTimeut 是异步执行,作用域是 全局作用域

3、第三种方式:创建script 标签插入body

    var blockName = 'window作用域'
    function exec(jsCode) {
      var blockName = '函数作用域'
      // eval(jsCode)
      // setTimeout(jsCode)
      let scriptEl = document.createElement('script')
      scriptEl.innerHTML = jsCode
      document.body.appendChild(scriptEl)
    }

    exec(`
      console.log('动态执行脚本里面执行 输出blockName',blockName)
      const res = new Promise((resolve,reject)=>{
        setTimeout(()=>{
          resolve('动态执行脚本里面执行 promise 更改状态为 成功')
        },1000)
      })
      res.then(res=>{
        console.log(res)
      })
    
    `)
    console.log('动态执行代码后继续执行');

在这里插入图片描述

可以看出,这个方式,也是 全局作用域, 同步执行代码

缺点是会在 body 标签里面你创建 script 标签

在这里插入图片描述

4、第四种方式:创建 Function

举个例子

const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));
// 输出: 8

语法

new Function(functionBody)
new Function(arg0, functionBody)
new Function(arg0, arg1, functionBody)
new Function(arg0, arg1, /* …, */ argN, functionBody)

参数

  • argN:被函数用作形参的名称。每个名称都必须是字符串,对应于一个有效的 JavaScript 参数(任何一个普通的标识符、剩余参数或解构参数,可选择使用默认参数),或用逗号分隔的此类字符串的列表。
  • functionBody:一个包含构成函数定义的 JavaScript 语句的字符串。就是函数体
    var blockName = 'window作用域'
    function exec(jsCode) {
      var blockName = '函数作用域'
      // eval(jsCode)
      // setTimeout(jsCode)
      // let scriptEl = document.createElement('script')
      // scriptEl.innerHTML = jsCode
      // document.body.appendChild(scriptEl)
      new Function(jsCode)()
    }

    exec(`
      console.log('动态执行脚本里面执行 输出blockName',blockName)
      const res = new Promise((resolve,reject)=>{
        setTimeout(()=>{
          resolve('动态执行脚本里面执行 promise 更改状态为 成功')
        },1000)
      })
      res.then(res=>{
        console.log(res)
      })
    
    `)
    console.log('动态执行代码后继续执行');

在这里插入图片描述

可以看出也是 同步执行全局作用域

5、对比

方式代码执行顺序代码执行时作用域缺点
eval同步执行执行时候的作用域
setTimeout异步执行全局作用域
创建 script 标签插入body同步执行全局作用域会在浏览器控制台元素里面看到这个插入的script 标签内容
创建 Function同步执行全局作用域

6、 参考链接

  • eval MDN
  • setTimeout MDN
  • Function MDN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础篇——学习Linux基本工具安装教程视频链接

本篇文章就是记录一下学习Linux需要用到的基本工具的视频教程链接&#xff0c;方便以后查看 VMware15.5安装 安装视频教程&#xff1a;VMware15.5安装教程 centos7.6安装&#xff08;这个视频教程真的很nice&#xff09; 视频教程&#xff1a;centos7.6 虚拟机克隆、快照、…

数字化转型过程中企业会遇到哪些挑战?该如何应对?

你是否与我一样&#xff0c;也曾有过类似的疑惑&#xff1a; 企业数字化转型过程中会遇到哪些挑战&#xff1f;其中苦难&#xff0c;我们又该如何应对&#xff1f;有什么可借鉴的方法&#xff1f; 有了这些疑问&#xff0c;你肯定想知道答案。 为了解决你的心头之患&#xf…

开放式耳机哪个品牌最好?2024高热度机型推荐,选购不迷茫

选购开放式耳机时&#xff0c;面对琳琅满目的品牌与型号是否感到不知道怎么选择&#xff1f;别担心&#xff0c;作为耳机爱好者与资深评测人&#xff0c;我精心整理了几款热门开放式耳机的全面对比。这次对比不仅涵盖如何挑选&#xff0c;有哪些不要菜类的额点&#xff0c;还推…

AD9026芯片开发实录6-example code

官方发布的软件包中&#xff0c;带了一份example code&#xff0c;用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下&#xff1a;“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成&#xff1a; initd…

[开源软件] 支持链接汇总

“Common rules: 1- If the repo is on github, the support/bug link is also on the github with issues”" label; 2- Could ask questions by email list;" 3rd party software support link Note gcc https://gcc.gnu.org openssh https://bugzilla.mindrot.o…

CAN通信波形【示波器抓取】

在测试bms系统过程中&#xff0c;在上位机发现无法读取CAN通信&#xff0c;尝试使用示波器抓取CAN通信波形&#xff0c;&#xff0c;去确定CAN通信是否正常。 做一想要从车上测出can总线上的数据还不太容易。 于是我首先使用示波器&#xff08;我使用的示波器型号是TDS 220&am…

Python爬虫与数据可视化:构建完整的数据采集与分析流程

Python爬虫技术概述 Python爬虫是一种自动化的数据采集工具&#xff0c;它可以模拟浏览器行为&#xff0c;访问网页并提取所需信息。Python爬虫的实现通常涉及以下几个步骤&#xff1a; 发送网页请求&#xff1a;使用requests库向目标网站发送HTTP请求。获取网页内容&#xf…

雷电模拟器9 开启指针位置但是,没有任何作用,解决方法

问题&#xff1a;雷电模拟器9 开启指针位置&#xff0c;但是没有作用。 参考文档&#xff1a; https://blog.csdn.net/qq_39587350/article/details/127234421解决方法&#xff1a; 1.找到雷电模拟器的安装位置 2.进入安装位置&#xff0c;找到vms 文件夹&#xff0c;并创建 …

想要打造超高性能的接口API?试试这12条小技巧。

1. 并行处理 简要说明 举个例子&#xff1a;在价格查询链路中&#xff0c;我们需要获取多种独立的价格配置项信息&#xff0c;如基础价、折扣价、商户活动价、平台活动价等等。 CompletableFuture 是银弹吗&#xff1f; 使用 CompletableFuture 的确能够帮助我们解决许多独…

从零开始实现大语言模型(二):文本数据处理

1. 前言 神经网络不能直接处理自然语言文本&#xff0c;文本数据处理的核心是做tokenization&#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理&#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…

VUE3 播放RTSP实时、回放(NVR录像机)视频流(使用WebRTC)

1、下载webrtc-streamer&#xff0c;下载的最新window版本 Releases mpromonet/webrtc-streamer GitHub 2、解压下载包 3、webrtc-streamer.exe启动服务 &#xff08;注意&#xff1a;这里可以通过当前文件夹下用cmd命令webrtc-streamer.exe -o这样占用cpu会很少&#xff0c…

echarts用pictorialBar实现3D柱状图

先看下效果 实现思路 描绘一个普通的柱状图通过象形柱图&#xff08;pictorialBar&#xff09;在柱状图的顶部添加一个图形类型&#xff08;symbol&#xff09;菱形 代码实现 <template><div id"symbolBar"></div> </template> <scrip…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

分班查询系统,老师们应该如何制作?

新学期的开始&#xff0c;作为教师&#xff0c;我们面临的一项关键任务就是组织分班。传统分班方法往往需要处理大量的数据&#xff0c;这个过程不仅耗时&#xff0c;而且容易出错。为了简化这一流程&#xff0c;提高效率&#xff0c;我们可以利用现代技术&#xff0c;创建一个…

不要再被骗了!电脑无法进入系统的原因可能是这个硬件坏了而已……

前言 前段时间小白在抖音上发了很多很多很多的视频&#xff0c;其中应该是有很多商家关注了小白。 然后就会出现很多很多很多的赚钱小门道…… 电脑开机没有显示&#xff1f;换显卡&#xff01; 电脑还是不开机&#xff1f;换CPU 电脑还是一样不开机…… 经过了一番大折腾…

三步学会使用WebSocekt

目录 一 什么是websocket 二 如何使用websocket 1.导入websocket的maven坐标 2.创建websocket的服务类 3.创建websocket的配置类 4.按需求实现业务逻辑 5.前端实现websocket 一 什么是websocket websocket和HTTP一样是基于TCP的一个通信协议。不过他是支持客户端和服务端…

鸿蒙开发Ability Kit(程序访问控制):【使用粘贴控件】

使用粘贴控件 粘贴控件是一种特殊的系统安全控件&#xff0c;它允许应用在用户的授权下无提示地读取剪贴板数据。 在应用集成粘贴控件后&#xff0c;用户点击该控件&#xff0c;应用读取剪贴板数据时不会弹窗提示。可以用于任何应用需要读取剪贴板的场景&#xff0c;避免弹窗…

JDK动态代理-AOP编程

AOPTest.java&#xff0c;相当于main函数&#xff0c;经过代理工厂出来的Hello类对象就不一样了&#xff0c;这是Proxy.newProxyInstance返回的对象&#xff0c;会hello.addUser会替换为invoke函数&#xff0c;比如这里的hello.addUser("sun", "13434");会…

将数据切分成N份,采用NCCL异步通信,让all_gather+matmul尽量Overlap

将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据二.测试环境三.普通实现四.分块实现 本文演示了如何将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据 1.测试规模:8192*8192 world_size22.单算子:all_gather:0.035…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…