<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## 實例 純函數 ``` var xs = [1,2,3,4,5]; // 純的 xs.slice(0,3); //=> [1,2,3] xs.slice(0,3); //=> [1,2,3] xs.slice(0,3); //=> [1,2,3] ``` 不純函數 ``` // 不純的 xs.splice(0,3); //=> [1,2,3] xs.splice(0,3); //=> [4,5] xs.splice(0,3); //=> [] ``` ## 有哪些副作用 * 更改文件系統 * 往數據庫插入記錄 * 發送一個 http 請求 * 可變數據 * 打印/log * 獲取用戶輸入 * DOM 查詢 * 訪問系統狀態 概括來講,只要是跟函數外部環境發生的交互就都是副作用——這一點可能會讓你懷疑無副作用編程的可行性。函數式編程的哲學就是假定副作用是造成不正當行為的主要原因 這并不是說,要禁止使用一切副作用,而是說,要讓它們在可控的范圍內發生 . ## 純函數好處 函數是不同數值之間的特殊關系:每一個輸入值返回且只返回一個輸出值,如輸入相同的x值,都只是返回相同的值y ### 可緩存性(Cacheable) ``` const memoize=function (f) { const cache = {}; return function () { const arg = JSON.stringify(arguments); const res =cache[arg]|| f.apply(f,arguments); cache.arg= res return res } } // 需要緩存的函數 const squareNumber = memoize(function(x){ return x*x; }); const square = memoize(squareNumber) console.log(square(1)); // 1 console.log(square(2)); // 4 console.log(square(1)); // 1 ``` 延遲執行的方式把**不純的函數轉換為純函數** ``` var pureHttpCall = memoize(function(url, params){ return function() { return $.getJSON(url, params); } }); ``` - 當調用它的時候才會發請求。這個函數之所以有資格成為純函數,是因為它總是會根據相同的輸入返回相同的輸出:給定了`url`和`params`之后,它就只會返回同一個發送 http 請求的函數 - 我們的`memoize`函數工作起來沒有任何問題,雖然它緩存的并不是 http 請求所返回的結果,而是生成的函數。 ### 可移植性/自文檔化(Portable / Self-Documenting) 純函數是完全自給自足的 ``` // 不純的 var signUp = function(attrs) { var user = saveUser(attrs); welcomeUser(user); }; var saveUser = function(attrs) { var user = Db.save(attrs); ... }; var welcomeUser = function(user) { Email(user, ...); ... }; // 純的 var signUp = function(Db, Email, attrs) { return function() { var user = saveUser(Db, attrs); welcomeUser(Email, user); }; }; var saveUser = function(Db, attrs) { ... }; var welcomeUser = function(Email, user) { ... }; ``` 在 JavaScript 的設定中,可移植性可以意味著把函數序列化(serializing)并通過 socket 發送。也可以意味著代碼能夠在 web workers 中運行。總之,可移植性是一個非常強大的特性 ### 可測試性(Testable) 純函數讓測試更加容易。我們不需要偽造一個“真實的”支付網關,或者每一次測試之前都要配置、之后都要斷言狀態(assert the state)。只需簡單地給函數一個輸入,然后斷言輸出就好了 ### 合理性(Reasonable) 很多人相信使用純函數最大的好處是*引用透明性*(referential transparency ### 并行代碼 最后一點,也是**決定性**的一點:我們可以并行運行任意純函數。因為純函數根本不需要訪問共享的內存,而且根據其定義,純函數也不會因副作用而進入競爭態(race condition)。 并行代碼在服務端 js 環境以及使用了 web worker 的瀏覽器那里是非常容易實現的,因為它們使用了線程(thread)。不過出于對非純函數復雜度的考慮,當前主流觀點還是避免使用這種并行。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看