All Articles

JavaScript為什麼要函數式?

結論: 因為JS透過函數式可以跑得更快,原因是在資料存取過程,避免了最耗時間的重複複製釋放

解說: 這裡發生了什麼?

function f(a) {
console.log(a);
}
f(100);

  1. 內存調用出一塊填充函數數據並用f作為標示地址
  2. 調用f,並把整數100複製給f地址的內存並用a作為符號標示
  3. 輸出符號a儲存的數據
  4. 釋放符號a使用的內存
  • 但…如果是下面這樣的情況呢

    function f(text, i) {
          console.log(text.charAt(i));
      } 
      var text = 'Here is a Long long text .........';
      f(text, 0);
      f(text, 1);
      f(text, 2);
      f(text, 3);
      f(text, 4);
      f(text, 5); 
    
- 跟上面範例1~4依樣,但是卻在3-4重複了6次,讓我們說白話。 - 在javascript裡面"a"代表16位元,整數 1 代表32位元,而"abcdefghij"十個字代表160位的內存100個字則相當於16K了,而一個文本遠遠超過這個數量

那怎麼辦呢?

  • 善用JS的Object

  • example

    const o = (object, i) => { console.log(object.text.chatAt(i)); }; const object = { text : ‘Here is a Long long text …’, }; f(object, 0); f(object, 1); f(object, 2); …

  • 這樣我們就只是複製 o 一個64位元的內存,比起整個文本差多了吧!!!

關於語法

  • 你可以寫

    define(f (lambda (x y g) (g x y))) define(g (lambda (x y) (+ x y))) (f (1 2 g))

  • 妳也可以寫較容易辨識的

    const f = (x, y, g) => { return g(x, y); } const g = (x, y) => { return x + y; } f(1, 2, g);

  • 機制一樣,任君選擇

關於使用方式

  • example

    const parse = (text, f) => { let match; for(let n=0;n<text.length;n++){ match = /Hi/.exec(text); if(match === null){ break; } f(match); } }

  • 這裡我們循環一個文本並用正則提取的Hi,再來如何最佳化調用呢?

  • below

    const greatFun = (text) => { let a = 0, b = 1, c = 2, d = “wow”; parser(text, (match) => { let t = a + b + c; console.log(t + d); }) }

  • 我們可以直接使用父函數的所有,效能就是一點一點優化的

以上是我學習Tulayang的文章,自己整理的心得

Published 22 Jun 2017