恩麼麼,有一種這樣的場景,隨着開發的場景越來越多,我們很多時候需要動態幾算,以前只要把函數封裝好就可以用了,有沒有考慮過講方法也動態封裝呢。。。
怎麼說呢,大神就是大神,很多我還沒用到的東西別人已經實現了,最近剛好用到…
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
最後
個人能力有限,只能簡單的總結一些可以用到的場景,拋磚引玉, 若有更好的方式,請告知過,茶水費豐厚
- 動態幾算, 比如我們做報表的時候把函數替分裝好
- 函數柯里化,以前我們可能只能處理部分參數,現在還可以處理更復雜的場景,參考koa的洋蔥模型,只要你願意,拓展性極強
- 通過call修改this指向,oop也是ok的
- 其他函數時編程設計功能函數
// 參數處理 總感覺那裏不對,求指點
function getFn() {
let fn = new Function('console.log(this.name, Array.from(arguments))');
return fn;
}
getFn().call(obj, 3, 4)