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

文章目录

    • 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 = jsCodedocument.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.mzph.cn/bicheng/39423.shtml

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

相关文章

获取目标机器的ssh反弹权限后,如何通过一台公网服务器的服务 jar 包进行偷梁换柱植入目录进行钓鱼,从而获取目标使用人的终端设备权限和个人信息?

网络攻防实战中获取目标机器的ssh反弹权限后,如何通过一台公网服务器的服务 jar 包进行偷梁换柱植入目录进行钓鱼,从而获取目标使用人的终端设备权限和个人信息? 具体流程如下: 1)获取了目标用户经常访问的一台服务器信息,并能反弹shell回来进行远程ssh链接; 2)分析…

Linux指定文件权限的两种方式-符号与八进制数方式示例

一、指定文件权限可用的两种方式&#xff1a; 对于八进制数指定的方式&#xff0c;文件权限字符代表的有效位设为‘1’&#xff0c;即“rw-”、“rw-”、“r--”&#xff0c;以二进制表示为“110”、“110”、“100”&#xff0c;再转换为八进制6、6、4&#xff0c;所以777代表…

Android 11.0 SettingsProvider 源码分析

文章目录 一、SettingsProvider 的概述二、SettingsProvider 的启动流程三、对 SettingsProvider 进行操作方法四、客制化示例 一、SettingsProvider 的概述 SettingsProvider 是一个为 Android 系统设置提供数据共享的 Provider&#xff0c;它包含全局、安全和系统级别的用户…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示&#xff0c;企业使用WLAN…

【拓展】理解AppID、OpenID、UnionID

目录 历史背景AppIDAppSecretOpenIDUnionID三者区别使用方法AppIDOpenID/**UnionID**拓展 历史背景 基本概念介绍 | 微信开放文档 微信小程序&#xff1a;一文彻底搞懂openid和unionid-腾讯云开发者社区-腾讯云 用户进行小程序登陆时&#xff0c;需要获取用户信息&#xff0c;…

通用的ERP系统功能清单有哪些?

一、通用的ERP系统功能清单 通用的ERP&#xff08;Enterprise Resource Planning&#xff0c;企业资源计划&#xff09;系统是一套集成的业务应用程序&#xff0c;旨在帮助企业有效管理财务、销售、运营等关键业务流程。以下是一个清晰的ERP系统功能清单&#xff0c;涵盖了其主…

【Flutter】列表流畅性优化

前言 在日常APP的开发中&#xff0c;列表是使用频率最高的&#xff0c;这里讲述在Flutter中优化列表的滑动速度与流畅度&#xff0c;以来提高用户的体验。 方案 1、使用ListView.builder代替ListView ListView.builder在创建列表的时候要比ListView更高效&#xff0c;因为L…

工程技术类SCI,低分快刊首选期刊,无版面费!

1、期刊概况 【期刊简介】IF&#xff1a;1.0-2.0&#xff0c;JCR2区&#xff0c;中科院4区&#xff1b; 【检索情况】SCIE在检 【版面类型】正刊&#xff0c;仅少量版面&#xff1b; 【出刊频率】年刊 2、征稿范围 本刊主要是发表有关能源转型和可再生能源需求相关的研究文…

Snappy使用

Snappy使用 Snappy是谷歌开源的压缩和解压的开发包&#xff0c;目标在于实现高速的压缩而不是最大的压缩 项目地址&#xff1a;GitHub - google/snappy&#xff1a;快速压缩器/解压缩器 Cmake版本升级 该项目需要比较新的cmake&#xff0c;CMake 3.16.3 or higher is requi…

一首歌的时间 写成永远

大家好&#xff0c;我是秋意零。 就在&#xff0c;2024年6月20日。我本科毕业了&#xff0c;之前专科毕业挺有感触&#xff0c;也写了一篇文章进行记录。如今又毕业了&#xff0c;还是写一篇文章记录吧&#xff01;&#xff01; 专科毕业总结&#xff1a;大学三年总结&#xf…

【SpringBoot3学习 | 第1篇】SpringBoot3介绍与配置文件

文章目录 前言 一. SpringBoot3介绍1.1 SpringBoot项目创建1. 创建Maven工程2. 添加依赖(springboot父工程依赖 , web启动器依赖)3. 编写启动引导类(springboot项目运行的入口)4. 编写处理器Controller5. 启动项目 1.2 项目理解1. 依赖不需要写版本原因2. 启动器(Starter)3. Sp…

二刷 动态规划

什么是动态规划 Dynamic Programming DP 如果某一问题有很多重叠子问题&#xff0c;使用动态规划时最有效的 动态规划中每一个状态是由上一个状态推导出来的。 动规五部曲 1.确定dp数组以及下标的含义 2.确定递归公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数…

【java计算机毕设】仓库管理系统 MySQL springboot vue3 Maven 项目源码代码

目录 1项目功能 2项目介绍 3项目地址 1项目功能 【java计算机毕设】仓库管理系统MySQL springboot vue3 Maven小组项目设计源代码 2项目介绍 系统功能&#xff1a; vue3仓库管理系统&#xff0c;主要功能包含&#xff1a;个人信息管理&#xff0c;仓库管理&#xff0c;员工…

java设计模式(七)适配器模式(Adapter Pattern)

1、模式介绍&#xff1a; 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类&#xff0c;但是接口与客户端的要求不完全匹配的情况。它包括两种形式&…

【深度学习】注意力机制

https://blog.csdn.net/weixin_43334693/article/details/130189238 https://blog.csdn.net/weixin_47936614/article/details/130466448 https://blog.csdn.net/qq_51320133/article/details/138305880 注意力机制&#xff1a;在处理信息的时候&#xff0c;会将注意力放在需要…

gitee项目上不同的项目分别使用不用的用户上传

最近使用根据需要&#xff0c;希望不同的项目使用不同的用户上传&#xff0c;让不同的仓库展示不同的用户名&#xff01;&#xff01;&#xff01; 第一步查看全局的用户信息&#xff1a; # 查看目前全局git配置信息 git config -l #会输出全局的git配置信息 第二步进入到要设…

大科技公司大量裁员背后的真相

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

冒泡排序、选择排序、菱形

冒泡排序、选择排序、菱形 文章目录 一、冒泡排序二、选择排序三、菱形 一、冒泡排序 思路&#xff1a; 外层&#xff08;第一层&#xff09;循环控制循环次数&#xff0c;和业务无关 内层&#xff08;第二层&#xff09;循环用于比较相邻的2个值的大小&#xff0c;根据小到大…

B站、小红书“崩”了!阿里云紧急回应

7月2日&#xff0c;“B站崩了”“小红书崩了”冲上微博热搜&#xff01;据悉&#xff0c;“崩了”的原因是阿里云上海服务出现异常。 B站App无法使用浏览历史关注等内容&#xff0c;消息界面、更新界面、客服界面均不可用&#xff0c;用户也无法评论和发弹幕&#xff0c;视频评…

鸿蒙开发设备管理:【@ohos.multimodalInput.touchEvent (触摸输入事件)】

触摸输入事件 设备上报的触屏事件。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import {Action,ToolType,SourceType,Touch,TouchEvent} from ohos.multimodalInput.touchEvent;…