返回顶部
首页 > 资讯 > 前端开发 > VUE >ES6中如何实现new Function()语法
  • 217
分享到

ES6中如何实现new Function()语法

2024-04-02 19:04:59 217人浏览 安东尼
摘要

这篇文章给大家分享的是有关es6中如何实现new Function()语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:学习《ECMAScript6入门》中的模板字符串

这篇文章给大家分享的是有关es6中如何实现new Function()语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

具体如下:

学习《ECMAScript6入门》中的模板字符串的案例中看见了new Function()创建函数的语法:

let str = 'return ' + '`Hello ${name}!`';
let func = new Function('name', str);
func('Jack') // "Hello Jack!"

上面的代码传入name参数和字符串函数体,字符串函数体由模板字符串提供,非常简洁方便。

为理解new Function,于是找到了下面这篇文章:

下文翻译自:https://javascript.info/new-function

这里有一个很少被用到的新建函数的方法,但是有时候不得不使用它。

语法

新建函数的语法:

let func = new Function ([arg1[, arg2[, ...argN]],] functionBody)

换句话说,函数的参数(或更确切地说,各参数的名称)首先出现,而函数体在最后。所有参数都写成字符串形式。

通过查看示例,可以更容易理解。这是一个有两个参数的函数:

let sum = new Function('a', 'b', 'return a + b');
alert( sum(1, 2) ); // 3

如果所要新建的函数没有参数,那么new Function()只有一个函数体参数:

let sayHi = new Function('alert("Hello")');
sayHi(); // Hello

这个方式与其他方式最主要的不同点在于,函数是由在运行时传入的字符串创建的。

之前的所有声明都要求程序员在脚本中编写功能代码。

但new Function允许将任何字符串转换为函数。例如,我们可以从服务器接收新函数然后执行它:

let str = ... receive the code from a server dynamically ...
let func = new Function(str);
func();

它在非常特殊的情况下使用,例如当我们从服务器接收代码时,或者使用模板动态编译函数。对此的需求通常出现在开发的进阶阶段。

闭包(Closure)

通常,函数将它所创建的位置记录在特殊属性[[Environment]]中。 它引用了创建地点的词法环境。

但是当使用new Function()创建函数时,其[[Environment]]不是引用当前的词法环境,而是引用全局环境。

function getFunc() {
 let value = "test";
 let func = new Function('alert(value)');
 return func;
}
getFunc()(); // error: value is not defined

与常规方法比较:

function getFunc() {
 let value = "test";
 let func = function() { alert(value); };
 return func;
}
getFunc()(); // "test", 来自getFunc的词法环境

这个特殊的new Function表面看起来很奇怪,但在实践中显得非常有用。

想象一下,我们必须从字符串创建一个函数。在编写脚本时不知道该函数的代码(这就是我们不使用常规函数的原因),但在执行过程中将会知道。我们可能会从服务器或其他来源收到它。

我们的新函数需要与主脚本进行交互。

也许我们希望它能够访问外部的局部变量?

问题是在JavaScript发布到生产之前,它是使用minifier压缩的——一个通过删除额外的注释,空格来缩小代码的特殊程序,而且 - 重要的是,会将局部变量重命名为较短的变量。

例如,如果一个函数中有let userName,那么minifier会替换它为let a(或者如果a被占用,则用另一个字母替换),这个过程会在任何地方进行。这通常是一件安全的事情,因为被替换的变量是局部的,函数外部没有任何东西可以访问它。并且在函数内部,minifier取代了它的每一个提及。Minifiers很聪明,他们会分析代码结构,所以他们不会破坏任何东西。他们不是只会愚蠢地发现和替换。

但是,如果new Function可以访问外部变量,那么它将无法找到userName,因为userName在代码缩小后才作为字符串传入。

所以,即使我们可以在new Function中访问外部词汇环境,我们也会遇到minifiers的问题。

而这时,new Function的“特色”可以让我们免于犯错。

它强制执行更好的代码。如果我们需要将某些东西传递给由new Function创建的函数,我们应该将它作为参数显式传递(可以避免直接读取外部变量时产生的问题)。

我们的“sum”函数实际上是这样正确使用的:

let sum = new Function('a', 'b', 'return a + b');
let a = 1, b = 2;
// 外部变量作为参数传入
alert( sum(a, b) ); // 3

总结

语法:

let func = new Function(arg1, arg2, ..., body);

历史原因,参数也可以以逗号分隔的列表的形式给出。

这三个意思相同:

new Function('a', 'b', 'return a + b'); // 基础语法
new Function('a,b', 'return a + b'); // 逗号分隔
new Function('a , b', 'return a + b'); // 逗号加空格分隔

使用new Function创建的函数,其[[Environment]]引用全局词法环境,而不是包含该函数的外部词法环境。因此,他们不能使用外层的变量。但这确实很好,因为它可以使我们免于错误。明确地传递参数在架构上是一种更好的方法,并且不会在使用minifiers时不会产生问题。

感谢各位的阅读!关于“ES6中如何实现new Function()语法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: ES6中如何实现new Function()语法

本文链接: https://lsjlt.com/news/71913.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ES6中如何实现new Function()语法
    这篇文章给大家分享的是有关ES6中如何实现new Function()语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:学习《ECMAScript6入门》中的模板字符串...
    99+
    2024-04-02
  • 如何实现ES6的class语法
    这篇文章主要为大家展示了“如何实现ES6的class语法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现ES6的class语法”这篇文章吧。实现 ES6 ...
    99+
    2024-04-02
  • 如何在idea 中配置ES6语法
    本篇文章为大家展示了如何在idea 中配置ES6语法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、点击File→settings:2、选择Languages & Frameworks下面...
    99+
    2023-06-06
  • es6中如何实现继承
    本篇内容介绍了“es6中如何实现继承”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • jquery中如何实现无new构建
    这篇文章主要为大家展示了“jquery中如何实现无new构建”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery中如何实现无new构建”这篇文章吧。前言当...
    99+
    2024-04-02
  • Node.js中如何使用ES6导入语法
    Node.js中如何使用ES6导入语法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。模块是导出一个或多个值的 JavaScript 文件。...
    99+
    2024-04-02
  • ES6中如何实现迭代器
    这篇文章将为大家详细讲解有关ES6中如何实现迭代器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。迭代器(Iterator)迭代器是一种接口,为各种不同的数据结构提供统一的...
    99+
    2024-04-02
  • ES6中如何实现Class类的静态方法
    这篇文章给大家分享的是有关ES6中如何实现Class类的静态方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个...
    99+
    2024-04-02
  • JavaScript中Function对象语法的实例用法
    本篇内容主要讲解“JavaScript中Function对象语法的实例用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中Function对...
    99+
    2024-04-02
  • idea中es6语法不支持如何解决
    这篇文章主要介绍“idea中es6语法不支持如何解决”,在日常操作中,相信很多人在idea中es6语法不支持如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”idea中e...
    99+
    2024-04-02
  • es6中如何实现数组去重
    这篇“es6中如何实现数组去重”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“es6中如何实...
    99+
    2024-04-02
  • 如何使用es6中的Object.assign()方法实现浅拷贝
    这篇文章主要为大家展示了“如何使用es6中的Object.assign()方法实现浅拷贝”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用es6中的Object.assign()方法实现浅拷...
    99+
    2023-06-17
  • ES6中javascript如何实现异步操作
    这篇文章主要为大家展示了“ES6中javascript如何实现异步操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6中javascript如何实现异步操作...
    99+
    2024-04-02
  • 如何使用ES6语法重构React
    这篇文章主要为大家展示了“如何使用ES6语法重构React”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用ES6语法重构React”这篇文章吧。使用ES6...
    99+
    2024-04-02
  • C语言中如何实现加法
    本文小编为大家详细介绍“C语言中如何实现加法”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中如何实现加法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先动手编写程序:#include <s...
    99+
    2023-06-17
  • es6中from方法如何用
    今天小编给大家分享一下es6中from方法如何用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2024-04-02
  • 如何将JavaScript代码改成ES6语法
    这篇文章给大家分享的是有关如何将JavaScript代码改成ES6语法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目录* 核心例子 * 修改成静态变量(co...
    99+
    2024-04-02
  • vscode不支持es6语法如何解决
    这篇文章主要讲解了“vscode不支持es6语法如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vscode不支持es6语法如何解决”吧! ...
    99+
    2024-04-02
  • ES6基础语法之模块化怎么实现
    本篇内容介绍了“ES6基础语法之模块化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ES6 引入了模块化, ES6 的模块化分为导出...
    99+
    2023-06-30
  • ES6如何实现数组拼接
    这篇文章将为大家详细讲解有关ES6如何实现数组拼接,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数组拼接展开运算符可以取代 concat的地位了const on...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作