JaveScript 的 newFunction

1、new Function的基础概念

  • new Function() 是 JavaScript 中的一个构造函数,它可以实例化一个新的函数对象并返回。该函数对象可以使用传递给 new Function() 的字符串参数作为函数体,并使用其他传递给它的参数作为函数参数,从而动态创建一个可执行的函数。
  • 使用 new Function 创建的函数,它的 [[Environment]] 指向全局词法环境,而不是函数所在的外部词法环境。因此,我们不能在 new Function 中直接使用外部变量。不过这样是好事,这有助于降低我们代码出错的可能。并且,从代码架构上讲,显式地使用参数传值是一种更好的方法,并且避免了与使用压缩程序而产生冲突的问题。

2、语法结构

  • new Function() 构造函数可以接受多个字符串参数作为函数的参数和函数体
let func = new Function ([arg1, arg2, ...argN], functionBody);

其中,arg1, arg2, …, argn 为函数的参数列表,functionBody 为函数体的字符串表示。当调用 new Function() 函数时,JavaScript 引擎会将 arg1, arg2, …, argn 所表示的参数和 functionBody 所表示的函数体组合成一个新的函数对象,并将该对象返回。

3、示例

  • 简单函数

const add = new Function('a', 'b', 'return a + b;');
console.log(add(2, 3)); // 5
  • 复杂示例

// 示例数据
const FormData = reactive({feeTotal: 1000, res: ''
})/*** 使用new Function 执行前端js脚本* @param funBody 函数体*/
function customeFun(funBody: string) {if (!!funBody) {/*** new Function() 构造函数可以接受多个字符串参数作为函数的参数和函数体* new Function ([arg1[, arg2[, ...argn]],] functionBody)*/let customFunc = new Function('FormData', funBody)return customFunc(FormData)}return ''
}// 执行自定义js函数
function handleClick() {// 函数体let funBody= "if(FormData.feeTotal>500) {  return '费用金额异常!'} else {  return ‘金额有效!’;}"; let calcResult = customeFun(funBody)console.log(calcResult)
}
//调用方法
handleClick();// 费用金额异常!

3、支持es6语法,可使用?.处理对象空异常

// 如果使用空对象,或对象属性不存在会报语法错误
let funbody="if(FormData.a.d) {  return  true} else {  return false}"
//此时由于a.d属性不存在,会导致函数执行异常,此时可通过?.解决属性不确定引起的语法异常
let funbod="if(FormData?.a?.d) {  return  true} else {  return false}"
console.log(customeFun(funBody)) // false

4、总结

  • new Function() 的使用场景主要是动态生成 Javascript 代码的情况。由于它可以使用字符串形式作为函数体,并接受可变数量的参数,因此很适合在需要动态生成 JavaScript 代码的场景中使用。
  • new Function 可以实现前端函数或脚本的配置化,对于项目中做动态初始化个性设置,或数据提交前的动态逻辑处理十分便利。

5、补充知识

  • new Function 和 eval 的区别

    • 执行方式不同:new Function() 构造函数创建的函数对象只会在其被调用时才会执行,而 eval() 函数则立即执行其参数中的 JavaScript 代码,并返回其中的值(如果有)
    • 作用域不同:new Function() 构造函数创建的函数对象没有访问父作用域的能力,只能访问自己的局部变量和全局变量;而 eval() 函数则可以访问其自身函数作用域和父作用域的变量和函数,因此具有更高的灵活性和不可预知性。
    • 安全性不同:由于 new Function() 构造函数定义的函数对象是在严格的函数作用域下运行的,因此其代码不会改变或访问父作用域中的变量。因此,使用 new Function() 构造函数创建函数对象时,可以更好地保证其安全性。而 eval() 函数则无法保证代码的安全性,因为它可以访问并改变父作用域中的变量,从而具有更高的攻击风险。
    • 与 eval() 相比,new Function() 函数具有更好的性能。这是因为 new Function() 函数在编译时会创建一个新的函数对象,不会像 eval() 函数一样将代码注入到当前作用域中。相反,它只在需要时才编译并执行代码,因此在常规情况下,new Function() 的性能比 eval() 更好

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

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

相关文章

42 个通过示例解释所有 JavaScript 数组方法

今天,就让我们一起来看看这 42 个数组方法。 1. at 获取特定索引处的元素。 负索引表示从末尾开始计数(例如:-1 是最后一个元素)。 const names ["Jhon", "Bob", "Alice", "Joe"]; c…

服装店收银系统不只是收银 还需要线上商城和线上批发

一个综合性的服装店收银系统可以结合线上商城和线上批发功能,提供以下特点和优势: 线上商城:将服装店的商品信息同步到线上商城平台,让顾客可以通过网站或移动应用程序浏览和购买商品。线上商城可以实现在线支付、订单跟踪、售后服…

MySQL数据库索引优化

一、引言 1. 索引的重要性 MySQL数据库索引的重要性主要体现在,一是查询速度优化,索引可以极大地提高查询速度。对于没有索引的表,MySQL必须进行全部扫描来找到所需的行,如果表中数据量很大,那么通常很慢。通过适当的…

大数据规模存储的几个核心问题

文章目录 三个关键问题RAID(独立磁盘冗余阵列)RAID是如何解决关于存储的三个关键问题?水平伸缩 大规模数据存储都需要解决几个核心问题,这些问题都是什么呢? 三个关键问题 1.数据存储容量的问题 既然大数据要解决的…

图像分割实战-系列教程1:语义分割与实例分割概述

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 下篇内容: Unet系列算法 1、图像分割任务概述 1.1 图像分割 分割任务就是在原始图像…

window的OPen方法,弹窗的特征

文章目录 一、介绍二、弹窗的特征 一、介绍 window.open() 方法是 JavaScript 中的一个内置方法,用于在浏览器中打开一个新的窗口或标签页。 语法: window.open(url, name, features, replace)二、弹窗的特征 open方法参数说明: 参数说明url要载入窗…

【算法】数论---取模运算法则

取模运算(余数运算)有一些基本的运算法则: (a b) % m (a % m b % m) % m(a - b) % m (a % m - b % m) % m(a * b) % m (a % m * b % m) % ma ^ b % p ((a % p)^b) % p 取模运算(余数运算)有一些基本的性质&…

2023年12月第4周面试算法题总结

809. 情感丰富的文字——阅读理解题 1、s “abcd”; words [“abc”]; 的情况怎么处理 2、怎么求lens与lenw?(连续出现的字符串长度) class Solution { public: bool isStretchy(const string& s, const string& word) {int i 0…

基于SpringBoot的医疗挂号管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的医疗挂号管理系统,java…

详述numpy中的np.random各个函数的用法

文章目录 引言np.random.rand()np.random.randn()np.random.randint(low,high,size,dtype)np.random.uniform(low,high,size)参考文献 引言 在机器学习还有深度学习中,经常会用到这几个函数,为…

AKShare学习笔记

AKShare学习笔记 本文内容参考AKShare文档。AKShare开源财经数据接口库采集的数据都来自公开的数据源,数据接口查询出来的数据具有滞后性。接口参考AKShare数据字典。 AKShare环境配置 安装Anaconda,使用Anaconda3-2019.07版本包,配置清华数…

Elasticsearch8集群部署

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 本文记录在3台服务器上离线搭建es8.7.1版本集群。 1. 修改系统配置 1.1 hosts配置 在三台es节点服务器加入hostname解析&…

加法器原理详解

加法器的介绍与原理分析 什么是加法器? 加法器是一种数字电路,用于将两个二进制数相加并输出它们的和。 如何实现加法器 要讨论如何实现加法器就要先从只有一位的数字先进行考虑 一位二进制数相加 不考虑来自低位的进位——半加器 对于一位二进制…

【VTK三维重建-体绘制】第四期 VTK中GPU加速

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 上期内容讲到VTK的体绘制技术vtkGPUVolumeRayCastMapper,本文分享VTK中GPU加速的相关内容,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会…

图像分割实战-系列教程7:unet医学细胞分割实战5(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 unet医学细胞分割实战1 unet医学细胞分割实战2 unet医学细胞分割实战3 unet医学细胞分割实战4 unet…

机器学习的分类与经典算法

机器学习算法按照学习方式分类,可以分为有监督学习(Supervised Learning)、无监督学习(Unsupervised Learning)、半监督学习(Semi-supervised Learning)、强化学习(Reinforcement Le…

[NAND Flash 5.1] 闪存芯片物理结构与SLC/MLC/TLC/QLC

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 1 闪存芯片简介 闪存颗粒是固态硬盘中数据的真实存储地,就像机械硬盘的磁盘一样。 闪存颗粒flash memory是一种存储介质,重要的区别于传统机械盘…

bat脚本:将ini文件两行值转json格式

原文件 .ini&#xff1a;目标转换第2行和第三行成下方json [info] listKeykey1^key2^key3 listNameA大^B最小^c最好 ccc1^2^3^ ddd0^1^9目标格式 生成同名json文件&#xff0c;并删除原ini文件 [ { "value":"key1", "text":"A大" …

动态规划 | 最长公共子序列问题

文章目录 最长公共子序列题目描述问题分析程序代码复杂度分析 最短编辑距离题目描述问题分析程序代码复杂度分析 编辑距离题目描述输入格式输出格式 问题分析程序代码 最长公共子序列 题目描述 原题链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共…

图文证明 等价无穷小替换

等价无穷小替换 定义 等价无穷小是无穷小之间的一种关系&#xff0c;指的是&#xff1a;在同一自变量的趋向过程中&#xff0c;若两个无穷小之比的极限为1&#xff0c;则称这两个无穷小是等价的。无穷小等价关系刻画的是两个无穷小趋向于零的速度是相等的。 设当 x → x 0 时…