千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:太原千锋IT培训  >  技术干货  >  你需要深入了解一下JavaScript的new Function

你需要深入了解一下JavaScript的new Function

来源:千锋教育
发布人:qyf
时间: 2023-01-31 17:57:17

  JavaScript技术一直处于不断发展壮大中,如果你是前端开发人员或者JavaScript开发工程师,那么,今天这个知识点,你有必要认真了解一下,它就是“newFunction”。

  1、语法

  语法如下:

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

  最后一个参数必须是函数体,其余参数作为传递给函数体的参数。

  例如:

  let sum = new Function('a', 'b', 'return a + b');

  console.log(sum(1, 2)); // the result is 3

  我们平时开发 JavaScript 或者 Node.js 的时候,没有理由使用 new Function 构造函数,因为不需要直接使用函数或者 () => {} 箭头函数。

  这是否意味着 new Function 语法是一个鸡肋的功能?

  千万不要这样想!因为它绝对不是你想的那样!

  new Function 语法有一个特别强大的特性,使它在 JavaScript 中发挥着不可替代的作用。

  有什么特点?也就是函数体的数据格式是字符串,真是不可思议!

  不可替代的角色

  这里有几个例子来展示 new Function 语法的微妙之处。

  01).无效的 JSON 对象字符串合法化

  例如,有以下字符串:

  let str = `{ "id": 103, name: 'yh', 'date': '2022–07–06' }`;

  其中的字符串不符合JSON格式(键值需要双引号),使用JSON.parse()解析会报错。

  那么,有没有什么办法可以把这个字符串对象转换成可以解析的JSON呢?

  很多人会想到正则匹配然后替换,或者使用eval等渣属性进行处理。

  没必要这么麻烦, new Function 上线了,就完美了!

  JS 代码如下所示:

  console.log(JSON.stringify(new Function('return ' + str)()));

  // The return result is: '{"id":10393,"name":"yh","date":"2022–07–06"}'

  使用返回语法,你可以轻松地将任意字符串转换为其他 JavaScript数据类型。

  02).模板字符串作为模板

  比如Vue、React等现在都有自己的模板语法,比如{}语法。

  如果我们想直接使用 ES6 自己的语法作为模板语言,就必须使用 new Function 的能力,比如下面的 HTML:

<template id="template">

 ${data.map(function (obj, index) {

return `<p>Article: ${obj.article}</p>

<p>Author: ${obj.author}</p>

`;

 }).join('')}

</template>

  我们可以扩展字符串并定义一个名为 interpolate 的字符串方法来将 ES6 语法字符串转换为可执行的 ES6 代码:

  String.prototype.interpolate = function (params) {

  const names = Object.keys(params);

  const vals = Object.values(params);return new Function(…names,`return \`${this}\`;`)(…vals);

  };

  至此,只要有对应的数据,我们就可以根据模板获取最终编译好的HTML字符串,例如:

  const html = template.innerHTML.interpolate({

  data: [{

  article: 'Article title one',

  author: 'y'

  }, {

  article: 'Article title two',

  author: 'h'

  }]

  });

  console.log(html);

  可以看出,无需任何第三方模板渲染引擎,就能使用复杂语法下的模板渲染效果,原生JS爱好者欣喜若狂。

  03).闭包和上下文

  new Function 的 body 参数中变量的上下文是全局的,不是私有的,没有所谓的闭包。

  例如,下面新函数代码中的值与主函数中的值无关:

  function getFunc() {

  let value = 'yh';

  let func = new Function('console.log(value)');

  return func;

  }

  getFunc()(); // error: value is not defined

  如果是常规函数语法,没有问题:

  function getFunc() {

  let value = 'yh';

  let func = function () {

  console.log(value)

  };

  return func;

  }

  getFunc()(); // print 'yh'

  04).其他

  与 new Function 语法类似的是新的RegExp,它可以使用字符串作为正则表达式的内容,特别适合动态匹配,或者增加代码混淆(一些混淆工具可以对字符串进行混淆)。例如,要匹配以动态值开头的属性值,可以使用以下用法:

  let reg = new RegExp('^' + value, 'g')

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

React的遮羞布

2023-01-31

Local Storage的高阶用法

2023-01-31

javascript中如何将伪数组转换成真数组

2023-01-30

最新文章NEW

变量的预解析

2023-01-31

Vue中常见的组件间通信方案及典型应用场景

2023-01-31

VueJS中的动画菜单效果的实现

2023-01-31

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>