1。语法如下:letfunc=newFunction([arg1,arg2,…argN],functionBody);最后一个参数必须是函数体,其余参数传递给函数体参数。例如:letsum=newFunction('a','b','returna+b');console.log(sum(1,2));//结果是3我们通常开发JavaScript或Node.js,没有理由使用newFunction构造函数,因为不需要直接使用函数或()=>{}箭头函数。这是否意味着新的Function语法是一个错误的函数?不要这样想!因为它绝对不是你想的那样!新的Function语法有一个特别强大的特性,这使得它在JavaScript中无可替代。有什么特点?也就是函数体的数据格式是字符串,不可思议!不可替代的角色这里有几个例子来展示新函数语法的微妙之处。1).使无效的JSON对象字符串合法化。例如有如下字符串:letstr=`{"id":103,name:'yh','date':'2022–07–06'}`;where中的字符串不符合JSON格式(键值需要双引号),用JSON.parse()解析会报错。那么,有没有办法将这个字符串对象转换成可解析的JSON呢?很多人想到正则匹配然后替换,或者使用eval等scum属性进行处理。不用这么麻烦,新功能上线,完美!JS代码如下:console.log(JSON.stringify(newFunction('return'+str)()));//返回结果为:'{"id":10393,"name":"yh","date":"2022–07–06"}'使用返回语法,您可以轻松地将任何字符串转换为其他JavaScript数据类型。2).模板字符串作为Vue、React等模板,现在有自己的模板语法,例如{}语法。如果我们想直接使用ES6自带的语法作为模板语言,就必须使用newFunction的能力,比如下面的HTML:return`
文章:${obj.article}
作者:${obj.author}
`;}).join('')}我们可以展开字符串并定义一个名为interpolate的字符串方法,将ES6语法字符串转换为可执行的ES6代码:String.prototype.interpolate=function(params){constnames=Object.keys(params);constvals=Object.values(params);returnnewFunction(...names,`return\`${this}\`;`)(...vals);};至此,只要有相应的数据,我们就可以根据模板得到最终编译好的HTML字符串,eg:consthtml=template.innerHTML.interpolate({data:[{article:'文章标题一',author:'y'},{article:'文章标题二',author:'h'}]});控制台日志(html);可见,复杂语法下的模板渲染效果无需任何第三方模板渲染引擎即可使用,原生JS爱好者欣喜若狂。3).闭包和上下文newFunction的body参数中变量的上下文是全局的,不是私有的,没有所谓的闭包。例如,下面新函数代码中的值与主函数中的值无关:functiongetFunc(){letvalue='yh';letfunc=newFunction('console.log(value)');返回函数;}getFunc()();//error:valueisnotdefined如果是常规函数语法,没有问题:functiongetFunc(){letvalue='yh';letfunc=function(){console.log(value)};returnfunc;}getFunc()();//打印'yh'4).其他类似于newFunction的语法是newRegExp,它可以使用字符串作为正则表达式的内容,特别适合动态匹配,或者添加代码混淆(有些混淆工具可以混淆字符串)。例如,要匹配以动态值开头的属性值,可以使用以下用法:letreg=newRegExp('^'+value,'g');综上所述,以上就是我今天给大家分享的关于newFunction语法的知识。希望对您有所帮助。如果觉得有用,记得点赞,关注我,分享给你的朋友,说不定能帮到他。最后,感谢您的阅读,期待您的关注。让我们一起快乐地学习编程吧。