当前位置: 首页 > news >正文

JavaScript 中 new Function() 和 new function() 的区别

new function 是另一种创建函数的方式,其语法:

const func = new function ([arg1, arg2, …argn], functionbody);

一个简单的例子:

const sum = new function('a', 'b', 'return a + b');sum(1 + 2); // 3

嗯,这提供了很大的灵活性。这并不常见,但在某些情况下可以使用它。例如,当我们需要将模板动态编译为函数时,我们可以使用它,据我所知,这就是 vue.js 所做的。除此之外,如果我们需要从服务器接收代码字符串来动态创建函数,也可以使用它。

globalthis.a = 10;function createfunction1() {const a = 20;return new function('return a;');
}function createfunction2() {const a = 20;function f() {return a;}return f;
}const f1 = createfunction1();
console.log(f1()); // ?
const f2 = createfunction2();
console.log(f2()); // ?

答案是10和20。这是因为new function总是在全局范围内创建函数。运行时只能访问全局变量和它们自己的局部变量。

而 new function() 的目的是创建一个新对象并应用匿名函数作为构造函数。比如下面的例子:

const a = new (function () {this.name = 1;
})();console.log(a); // { name: 1 }

就是这样。实际上,每个 javascript 函数都是一个 function 对象,换句话说,(function () {}).constructor === function returns true。

关联的一个知识点是如何使用new function()创建异步函数? mdn给了我们答案:

// Since `AsyncFunction` is not a global object, we need to get it manually:
const AsyncFunction = (async function () {}).constructor;const fetchURL = new AsyncFunction('url', 'return await fetch(url);');fetchURL('/').then((res) => res.text()).then(console.log);

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 51. 数组中的逆序对
  • HTML中的文字与分区标记
  • Docker高级管理之compose容器编排与私有仓库的部署
  • UE5 对象池
  • 【研赛论文】数学建模2024华为杯论文word/latex模板
  • 希捷,AI时代的存储“破壁者”
  • R语言数据整理和分析(1)
  • 对接开源大模型应用开发平台最佳实践
  • B3635 硬币问题
  • vue3 指定元素全屏 screenfull(可直接粘贴使用)
  • 【Python机器学习】循环神经网络(RNN)——对RNN进行预测
  • Ansible自动化部署kubernetes集群
  • PowerShell收集信息及绕过PowerShell权限
  • 使用Nignx打包前端项目
  • Java数据结构(十)——冒泡排序、快速排序
  • [nginx文档翻译系列] 控制nginx
  • classpath对获取配置文件的影响
  • golang 发送GET和POST示例
  • JavaScript对象详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Redis 懒删除(lazy free)简史
  • Vue 动态创建 component
  • vue脚手架vue-cli
  • windows下使用nginx调试简介
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 编写高质量JavaScript代码之并发
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 和 || 运算
  • 项目管理碎碎念系列之一:干系人管理
  • 自定义函数
  • raise 与 raise ... from 的区别
  • 阿里云服务器如何修改远程端口?
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​Python 3 新特性:类型注解
  • ​马来语翻译中文去哪比较好?
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (5)STL算法之复制
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (备份) esp32 GPIO
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)SpringBoot3---尚硅谷总结
  • (一)认识微服务
  • (转)Scala的“=”符号简介
  • (转)程序员疫苗:代码注入
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET 8 跨平台高性能边缘采集网关
  • .net framework4与其client profile版本的区别
  • .net web项目 调用webService