es6 之 new Function

恩么么,有一种这样的场景,随着开发的场景越来越多,我们很多时候需要动态几算,以前只要把函数封装好就可以用了,有没有考虑过讲方法也动态封装呢。。。
怎么说呢,大神就是大神,很多我还没用到的东西别人已经实现了,最近刚好用到…

new Function

  • 语法
let func = new Function ([arg1, arg2, ...argN], functionBody);
// 上边的代码就是动态创建一个函数,我们的参数,函数体都左右参数传入
  • demo
// 求和 官方demo
let sum = new Function('a', 'b', 'return a + b');
console.log(sum(1, 2))

创建函数三种语法

new Function('a', 'b', 'return a + b'); // basic syntax
new Function('a,b', 'return a + b'); // comma-separated
new Function('a , b', 'return a + b'); // comma-separated with spaces
  • 动态函数体分装

不得 不说 模板字符串在这里也是极好用的

let fnBody = 'console.log("Hello, ${name}, nice to meet you!")'
let sayHello = new Function('name', fnBody)
sayHello('leo')

注意事项

看起来很美好,但是,但是, 但是
这么创建的函数作用域是在顶级,不在你代码运行的context域中,下边就是一个示范

 let val = '123';

function getFn() {
    let val = 'this is val!';
    let fn = new Function('console.log(val)');
    return fn;
}

getFn()() // 这里输出:123

最后

个人能力有限,只能简单的总结一些可以用到的场景,抛砖引玉, 若有更好的方式,请告知过,茶水费丰厚

  1. 动态几算, 比如我们做报表的时候把函数替分装好
  2. 函数柯里化,以前我们可能只能处理部分参数,现在还可以处理更复杂的场景,参考koa的洋葱模型,只要你愿意,拓展性极强
  3. 通过call修改this指向,oop也是ok的
  4. 其他函数时编程设计功能函数
// 参数处理 总感觉那里不对,求指点
function getFn() {
    let fn = new Function('console.log(this.name, Array.from(arguments))');
    return fn;
}

getFn().call(obj, 3, 4)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值