如何动态执行JS

这篇具有很好参考价值的文章主要介绍了如何动态执行JS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:随着行业发展,技术更新,生产结构发生变化,低代码技术又重新站上了舞台,开发者们成为了舞台幕后的操纵者。在web端的低代码开发工具中,js占据了重要的位置,而【动态执行】也成为了低代码开发工具中不可或缺的一部分。本文记录了js的动态执行方法,以备不时之需。

方法1:eval()

eval()函数来解析执行字符串代码,eval()函数接受一个字符串参数,将字符串解析为JavaScript代码并执行。

let a = ()=>{
    console.log(123);
    eval("console.log(234)");
    console.log(456);
}

注意:安全隐患,确保传入的代码串是安全的

方法2:Function

new Function('a', 'b', 'return a + b')(1,2); // 输出 3

方法3:setTimeout和setInterval

利用etTimeout()函数和setInterval()函数可以接受字符串参数的特性,可以建立异步的动态执行代码

setTimeout("console.log('Hello, world!')", 1000);

方法4:ES6中的模版字符串(Template Literals)

其实这里只是用到了模版字符串中解析变量的能力来存储动态变化的代码

let code = `
  let a = 1;
  let b = 2;
  console.log(a + b);
`;

eval(code); // 输出 3

方法5:with语句

with语句是JavaScript中的一种特殊语法,它可以将一个对象添加到作用域链的头部,从而可以直接访问该对象的属性和方法,而无需使用对象名称。with的这种特性在某些场景下是很有用的,比如vue源码中动态生成render代码的场景,如下:

export function generate (
 ast: ASTElement | void,
 options: CompilerOptions
): CodegenResult {
 const state = new CodegenState(options)
 const code = ast ? genElement(ast, state) : '_c("div")'
 return {
  render: `with(this){return $[code]}`,
  staticRenderFns: state.staticRenderFns
 }
}

注意:使用with语句动态执行代码需要谨慎使用,因为它会修改作用域链,可能会影响到其他代码的运行,同时也会降低代码的可读性和可维护性。

方法6:AsyncFunction和GeneratorFunction

AsyncFunction和GeneratorFunction是Function构造函数的后代,它们分别用于动态生成异步函数和生成器函数,语法与Function构造函数类似

const GeneratorFunction = function* () {}.constructor;

const foo = new GeneratorFunction(`
  yield 'a';
  yield 'b';
  yield 'c';
`);

let str = '';
for (const val of foo()) {
  str = str + val;
}

console.log(str);

const AsyncFunction = async function () {}.constructor;
let code = `
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("Hello, world!");
    }, 1000);
  });
`;

let asyncFn = new AsyncFunction(code);

asyncFn().then(result => {
  console.log(result); // 输出 "Hello, world!"
});

方法7:动态创建script标签

let code = 'console.log("Hello, world!");';
  let script = document.createElement('script');
  script.text = code;
  document.head.appendChild(script);

注意:使用script标签动态执行代码需要考虑到代码的作用域和依赖的问题,因为代码是在全局环境中执行的,可能会影响到其他代码的运行

方法8:新语法import(‘./xx.js’)

import()函数是ES6中引入的动态导入模块的方式,可以动态地加载一个JavaScript模块,并返回一个Promise对象

import('./module.js').then(module => {
  // 使用module中的代码
}).catch(error => {
  // 加载模块失败
});

import()函数接受一个字符串参数,表示要加载的模块文件路径。
注意:import()函数目前还不是所有浏览器都支持,需要使用Webpack等工具进行打包,或者使用Polyfill库进行兼容性处理。

方法9:Worker

Worker是在Web Worker API中引入的一种机制,它可以在独立的线程中运行JavaScript代码,并且可以与主线程进行通信。在Worker线程中可以动态执行代码,而且不会对主线程造成影响.

// 新建Worker线程
let worker = new Worker('worker.js');

// 发送消息给Worker线程,要求执行某个函数
worker.postMessage({ type: 'execute', code: 'console.log("Hello, world!")' });

// 监听Worker线程的消息
worker.onmessage = event => {
  // 处理消息
};

注意:使用Worker方式动态执行代码需要考虑到线程之间通信的问题,并且需要避免访问主线程的全局变量和DOM等资源,因为Worker线程和主线程是相互独立的。

方法10:Proxy

Proxy是ES6中引入的一种元编程机制,它可以拦截对象的各种操作,包括读取、赋值、调用等。利用Proxy,可以动态地创建一个代理对象,拦截对这个对象的操作,并在拦截器中执行代码.

let code = `
  let a = 1;
  let b = 2;
  console.log(a + b);
`;

let proxy = new Proxy({}, {
  get(target, property) {
    if (property === 'execute') {
      return () => {
        return eval(code);
      };
    }
  }
});

方法11:document.write()

直接把代码写入到HTML文档中文章来源地址https://www.toymoban.com/news/detail-459274.html

以上就是目前我了解到关于js动态执行的方法。

到了这里,关于如何动态执行JS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 天选之子Linux是如何发展起来的?为何对全球IT行业的影响如此之大?

    上面这副图是博主历时半小时完成的,给出了Linxu的一些发展背景。球球给位看官老爷们给个赞(可怜) 要说Linux( L inux i s n ot N UI X ),还得从UNIX说起。 阶段 内容 特殊操作系统:Multics 1968年,一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名Mu

    2024年02月08日
    浏览(41)
  • 重建与发展:数字资产借贷行业朝着可持续发展迈进!

       纵观历史,贷款和货币一样古老,无论哪种形式的货币都需要有其借贷市场。现在,比特币以其分散和透明的性质,在加密领域占据龙头地位。     就像之前的货币一样,比特币要真正蓬勃发展,也需要一个强大的借贷市场。然而到目前为止,大多数创建比特币信贷市

    2024年02月09日
    浏览(46)
  • 行业报告 | AIGC发展研究

    原创 | 文 BFT机器人 技术篇 深度学习进化史:知识变轨 风起云涌 已发生的关键步骤: 人工神经网络的诞生 反向传播算法的提出 GPU的使用 大数据的出现 预训练和迁移学习 生成对抗网络 (GAN) 的发明 强化学习的成功应用 自然语言处理的突破 即将发生的关键步骤: 通用人工智

    2024年02月13日
    浏览(40)
  • Genesis公链加速区块链行业发展

    区块链提供了分布式、去中心化、透明、可溯源和不可篡改的交易记录体系结构。与传统数据库相比,区块链技术有较高的交易准确性和安全系数,以及不需要第三方中介即可进行更加高效的金融活动。 当然尽管区块链行业发展如火如荼,但仍面临很多问题亟待解决。 信息

    2024年02月02日
    浏览(92)
  • 呼叫中心行业市场发展分析

    呼叫中心行业概述: 呼叫中心是为了客户服务、市场营销、技术支持和其它特定商业活动而接收和发出呼叫的一个实体。通俗而言,呼叫中心,就是在一个相对集中的场所,有一批服务营销人员组成的服务营销机构。呼叫中心通常会利用计算机通讯技术,处理来自企业客户的

    2024年02月02日
    浏览(44)
  • 行业报告|3D感知技术快速发展,打造“机器之眼”,助推各行业加速升级!

    原创 | 文 BFT机器人  01 3D视觉感知全栈式平台,硬核实力蓄势待发 1.1 3D视觉感知为“机器之眼”,未来市场空间广阔 3D视觉感知技术充分弥补了2D成像技术的以上不足,可获取空间几何尺寸信息。 过去数十年2D成像技术蓬勃发展,分辨率从几十万像素发展到现在的上亿像素,

    2024年02月10日
    浏览(36)
  • AI行业在中国的发展机遇与挑战

    作者:禅与计算机程序设计艺术 及背景介绍 随着科技革命带来的信息技术革命、产业互联网化和互联网金融的迅速发展,“人工智能”(Artificial Intelligence,AI)也被提上了重要的一环。在过去的两三十年里,随着人们对AI的不断追求和应用,机器学习和深度学习等领域的研

    2024年02月06日
    浏览(39)
  • 我对测试行业发展和自我价值诉求的思考

    测试 圈子生态的思考 其实测试的生态,说起来蛮简单的,一个词语概括就是两极分化。有个梗:hand hands,load loads,太贴切了。 两极分化这个词,可以从下面三个维度来看: 薪资 我认识的测试也算不少,月薪上下限从8k到55k不一而足;从年薪角度来说,package10W到100W+的都有

    2024年02月08日
    浏览(47)
  • 数字化底层逻辑揭秘!探寻地产工程行业发展新范式

    导语 |地产工程领域经过二十多年的高速发展,企业信息化已经趋于成熟。但进入数字化时代,地产工程产业数字化便面临诸多问题,因此,地厚云图创始人CEO,腾讯云 TVP 谢远玉老师,将深入地从工程产业数字化转型的逻辑出发,带我们从底层逻辑找寻这个行业未来发展的正

    2024年02月02日
    浏览(36)
  • 生成式 AI 已掀起浪潮,行业发展会怎么样?

    大家可以看看一些研究报告。 本报告总结成关键的6个部分: 1. 引言 :介绍生成式AI应用的概念和重要性,以及本文的主要内容和目的。 2. 生成式AI应用的基础知识 :包括什么是生成式AI、其与自然语言处理(NLP)之间的关系、数据隐私保护等方面的内容。 3. ChatGPT :介绍了

    2024年02月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包