百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

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

yund56 2025-07-23 21:42 2 浏览

新人求关注,点击右上角 ↗ 关注,博主日更,全年无休,您的关注是我的更新的动力~ 感谢大家了

JavaScript 确实很灵活,但这种灵活性也带来了一些困惑。例如,你可以用多种方式来做同一件事,比如创建函数、对象等等。那么,new Function()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()); // ?

答案是 1020。和你想的是不是一样的。

解释一下这是为什么,这是因为 new Function 总是在全局作用域中创建函数。在执行时,只能访问全局变量和它们自身的局部变量。

new function()

让我们来看看 new function()new function() 是用来创建一个新的对象并应用匿名函数作为构造函数的。

例如下面的例子:

const a = new (function () {
  this.name = 1;
})();

console.log(a); // { name: 1 }

就是这样。实际上,每一个 JavaScript 函数都是一个 Function 对象,换句话说:

(function () {}).constructor === Function 返回 true

这里引入一个深入的面试考点问题,就是如何使用 new Function() 创建一个异步函数?

从 MDN 上的文档,我们可以得出以下答案:

// 因为 `AsyncFunction` 不是一个全局对象,所以我们需要手动获取它:
const AsyncFunction = (async function () {}).constructor;

const fetchURL = new AsyncFunction('url', 'return await fetch(url);');

fetchURL('/')
  .then((res) => res.text())
  .then(console.log);

是不是感叹还有这种操作,我只想说在 js 中总有让你颠覆三观的实践

小结

欢迎留言评论,大家一起探讨,一起进步~ 欢迎点赞、关注、转发~

求关注~全年无休日更~ 求关注~

相关推荐

遨游于Linux的“老鸟想要一份学习pdf:鸟哥的Linux私房菜学习篇

您是准备学习Linux的“小菜鸟”,却不知道该如何下手?您是遨游于Linux的“老鸟想要一本案头必备的工具书?《鸟哥的Linux私房菜基础学习篇(第四版)》是您绝佳的选择!全新改版,提供您更新的技术...

Nodejs安装、配置与快速入门(nodejs安装要哪个模式)

Nodejs是现代JavaScript语言产生革命性变化的一个主要框架,它使得JavaScript从一门浏览器语言成为可以在服务器端运行、开发各种各样应用的通用语言。在不同的平台下,Nodejs的安装...

Linux 网络错误 TCP: too many orphaned sockets 分析与解决

问题起因:在服务器上部署了单个golang编写的HTTPDNS实例,一个固定的端口9981对外提供服务。当QPS达到几十万以上时,该实例(VPS、云服务器)崩溃,直接僵死状态,且无法再次启动。使用命令...

嵌入式Linux系列第2篇:运行Hello World

1.引言今天给大家介绍的是在一个嵌入式Linux板子上运行HelloWorld,软硬件入门学习的经典操作。依稀记得两年前,我第一次在飞思卡尔(现NXP)I.MX6上运行出HelloWorld的那种...

程序员入门必读的5本编程书(程序员入门必读的5本编程书是什么)

万事开头难,编程也是一样。掌握正确的学习方法和进阶路线,能够取到事半功倍的效果。在这里给初学编程的新手程序员,推荐5本入门的编程书籍。这五本书包括C语言、数据结构、算法、LINUX系统,还有数据库。如...

linux命令之重定向(linux重定向的类型和使用方法)

输出重定向bash的输出分为标准输出和错误输出标准输出文件描述符是1错误输出文件描述符是2而输出重定向可以将本应该输出到控制台的内容输出到文件标准输出重定向命令>文件覆盖原文件内容...

linux命令之权限管理(linux权限d)

权限管理命令权限的查看及含义可以使用ls-l来查看每个文件或目录的权限,一共有十位ls-ls-------------------------------------------------...

手摸手教你 CentOS 入门必备基础知识(建议收藏)

这里记录一下我的CentOS学习过程,相当于自己记个笔记,同时分享出来,如果有同学刚好有需要而这个文章帮助到了你的话,在下也会十分开心。文章最后推介了几个免费视频,B站和慕课上的免费学习视频挺多...

linux学习线路图(linux学习视频)

随着android的大热,基于linux的开发也更热了。linux的开发包括driver的开发以及应用程序的开发。由于我们习惯了windows,在开始使用linux的时候可能感觉很茫然,不知道如何下手...

【Python3.13】跟着官网学习Python系列

开篇个人而言,Python是写起来最顺手、看起来最喜欢的编程语言,也是实际工作中使用最多的编程语言。从Python入门,到完全使用Java,再回归Python,编程语言本质上是工具,与Excel、XM...

8个免费自学网站,值得收藏(免费的自学网站大全)

1.智慧教育(国家出品全年龄自学网站)国家教育部开发的线上智慧教育平台,适合从小学到大学到就业各年龄段爱自学的人,主要有三大类:中小学智慧教育一年级到高中三年级自学视频课程,,跟教材完全同步,还能免费...

10个最值得收藏的编程学习网站(好的编程网站)

程序员是一个需要不断学习的职业。幸运的是,在这个互联网时代,知识就在那里,等着我们去获取。以下我列举一些免费的编程学习网站包含多个开发语言Java、php、html、javascript等多个。1、h...

"不会Linux,干啥都费劲!”资深程序员:别再瞎努力了

学习过Linux都知道,它不像Windows是靠鼠标点击操作,而是靠指令和参数进行操控。如果你没系统的学习过它,那么工作时难免要遇到下面这些问题:1)面试开发,因为不会Linux的一个简单参数,马上就...

盘点 20 个编程学习教程网站,建议收藏

欢迎关注@程序员柠檬橙私信回复「1024」获取海量编程学习资源!如果你想学习编程,现在互联网这么方便,不用着急报名培训班,有很多高质量的编程学习资源网站可供你学习,程序员日常浏览的技术教程网站有哪些...

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

新人求关注,点击右上角↗关注,博主日更,全年无休,您的关注是我的更新的动力~感谢大家了JavaScript确实很灵活,但这种灵活性也带来了一些困惑。例如,你可以用多种方式来做同一件事,比如创...