<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Javascript中currying的實現

      Currying好像是函數式語言都有的一個特性,比如Perl,Python,Javascript。

      那么到底什么是Currying,我是在學習Closure時無意中接觸到這個定義的,覺得很是有趣。

      先看看 Wiki 中的定義:

      Currying is the technique of transforming a function that takes multiple arguments 

      in such a way that it can be called as a chain of functions each with a single argument.

      大概的意思就是說,將擁有多個參數的函數Currying化為擁有單一參數的函數形式。

      下面舉一個簡單的例子說明Javascript中的Currying實現,一個簡單的求和函數:

       

      function add(x, y) {
          
      return x + y;
      }
      console.log(
      'add(2, 3) == ' + add(23));

       

      對其進行Currying,及調用方法:

      function curry_add(x) {
          
      return function(y) {
              
      return x + y;
          }
      }
      console.log(
      'curry_add(2)(3) == ' + curry_add(2)(3));

       


      注意,curry_add(2) 返回的是函數。

       

      我們還可以定義一個通用的 curry 函數:

       

      function curry(fn) {
          
      var args = [];
          
      for (var i = 1; i < arguments.length; i++) {
              args.push(arguments[i]);
          }
          
      return function() {
              
      for (var i  = 0; i < arguments.length; i++) {
                  args.push(arguments[i]);
              }
              
      return fn.apply(window, args);
          }
      }

      這個函數至少接收一個參數(需要curry的函數),對于前面的 add 函數,我們可以這樣來調用:
      console.log('curry(add)(2, 3) == ' + curry(add)(23));
      console.log(
      'curry(add, 2)(3) == ' + curry(add, 2)(3));
      console.log(
      'curry(add, 2, 3)() == ' + curry(add, 23)());


      因為 curry(add, 2) 或 curry(add) 返回的還是函數,所以我們還可以對其進行Currying,如下代碼:

       

      console.log('curry(curry(add), 2)(3) == ' + curry(curry(add), 2)(3));
      console.log(
      'curry(curry(add, 2), 3)() ==' + curry(curry(add, 2), 3)());

       

      運行時截圖:

      代碼下載

       

      [update_2009-2-17]

      按照 @winter-cn 的提示,我來到另外一篇討論Currying的 文章 ,發現那里的做法是寫一個可以 Chain 的Currying,

      另外我還發現了一個我以前不知道的特性,add.length 返回的是函數形式參數的個數,比如這個例子中的 add.length == 2

      這就好辦了,我們可以根據傳遞進來的參數的多少來判斷是否返回執行結果或者是返回函數。

      我大概的想法是要用到遞歸,來看看我的實現:

       

      function curry2(fn) {
          
      var args = [];
          
      for  (var i = 1; i < arguments.length; i++) {
              args.push(arguments[i]);
          }
          
      return function() {
              
      for (var i = 0; i < arguments.length; i++) {
                  args.push(arguments[i]);
              }
              
      if (args.length >= fn.length) {
                  
      return fn.apply(window, args);
              }
              
      else {
                  
      return curry2.apply(window, [fn].concat(args));
              }
          }
      }
      console.log(
      'curry2(add)(2, 3) == ' + curry2(add)(23));
      console.log(
      'curry2(add)(2)(3) == ' + curry2(add)(2)(3));

       

      當然這樣的Currying技術,只能用在有明確形式參數的函數中,如果在add函數中使用arguments來捕獲參數,則這種Currying是行不通的。

      上面的add可能不是很明顯,來看看擁有 4 個參數的add2函數,以及使用Currying技術:

       

      function add2(x, y, z, k) {
          
      return x + y + z + k;
      }
      console.log(
      'curry2(add2)(1, 2, 3, 4) == ' + curry2(add2)(1234));
      console.log(
      'curry2(add2)(1, 2, 3)(4) == ' + curry2(add2)(123)(4));
      console.log(
      'curry2(add2)(1, 2)(3, 4) == ' + curry2(add2)(12)(34));
      console.log(
      'curry2(add2)(1)(2, 3, 4) == ' + curry2(add2)(1)(234));
      console.log(
      'curry2(add2)(1)(2)(3, 4) == ' + curry2(add2)(1)(2)(34));
      console.log(
      'curry2(add2)(1)(2)(3)(4) == ' + curry2(add2)(1)(2)(3)(4));

       

       

      更新的代碼下載

       

      附:John Resig在Pro Javascript一書中關于Currying的實現代碼:

       

      // A function that generators a new function for adding numbers
      function addGenerator( num ) {

          
      // Return a simple function for adding two numbers
          // with the first number borrowed from the generator
          return function( toAdd ) {
              
      return num + toAdd
          };

      }

      // addFive now contains a function that takes one argument,
      //
       adds five to it, and returns the resulting number
      var addFive = addGenerator( 5 );

      // We can see here that the result of the addFive function is 9,
      //
       when passed an argument of 4
      alert( addFive( 4 ) == 9 );

       

       

      posted @ 2009-02-17 15:36  三生石上(FineUI控件)  閱讀(3358)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 国产jlzzjlzz视频免费看| 无码av岛国片在线播放| 亚洲欧洲一区二区三区久久| 国产首页一区二区不卡| 丁香五月网久久综合| 亚洲精品人成网线在线播放va| 香蕉久久夜色精品国产成人| 玩弄放荡人妻少妇系列| 亚洲男人的天堂久久香蕉| 性色av一区二区三区精品| 欧美肥老太wbwbwbb| 国产一区二区一卡二卡| 亚洲一区二区约美女探花| 把女人弄爽大黄A大片片| 美女裸体黄网站18禁止免费下载| a4yy私人毛片| 91精品国产91热久久久久福利| 国产成人一区二区不卡| 18禁无遮挡啪啪无码网站| 香蕉eeww99国产在线观看| 国产999久久高清免费观看| 国产亚洲一区二区三不卡| 日韩深夜免费在线观看| 国产免费一区二区不卡| 人人妻人人澡人人爽曰本| 中日韩精品视频一区二区三区| 综合色在线| 韩国美女福利视频在线观看| 欲色欲色天天天www| 色99久久久久高潮综合影院| 福利一区二区不卡国产| 成人h动漫精品一区二区无码 | 胸大美女又黄的网站| 国产精品对白刺激久久久| 亚洲人成小说网站色在线| 察雅县| 天干天干夜天干天天爽| 久久香蕉国产线看观看怡红院妓院| 无码免费大香伊蕉在人线国产| 日本亚洲一区二区精品久久| 精品一区二区三区在线视频观看|