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)
發佈了167 篇原創文章 · 獲贊 21 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章