<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 柯里化、原生bind、防抖節流函數、實現promise

          2019-7-25    seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          多參數柯里
          原生bind
          實現promise
          防抖節流函數
          多參數柯里化

          參數fn可以是function(a,b,c){},也可以是function(a,b,c,d,f){}

          // 支持多參數傳遞
          function progressCurrying(fn, args) {

              var _this = this
              var len = fn.length;
              var args = args || [];
              return function() {
                  var _args = Array.prototype.slice.call(arguments).concat(args);
                  // 如果參數個數小于最初的fn.length,則遞歸調用,繼續收集參數
                  if (_args.length < len) {
                      return progressCurrying.call(_this, fn, _args);
                  }

                  // 參數收集完畢,則執行fn
                  return fn.apply(this, _args);
              }
          }

          原生js實現bind

          Function.prototype.myBind = function(Othis){
            if(typeof this !== "function"){
              return new TypeError("not a function");
            }
            let _this = this;
            let args = [...arguments].slice(1);
            let func = function(){};
            let fBound = function () {
              return _this.apply(this instanceof func ?this:Othis,[...arguments].concat(args));
            }
            func.prototype = _this.prototype;
            fBound.prototype = new func();
            return fBound;
          }

          防抖函數

          //每wait時間內執行一次,若期間被觸發,則重新執行
          function debounce(func,wait) {
            var timeout ;
            return function(){
              let args = [...arguments];
              let _this = this;
              if(timeout){
                clearTimeout(timeout);
              }
              timeout = setTimeout(function() {
                func.apply(_this,args);
              }, wait);
            }
          }

          節流函數

          //每wait時間執行一次
          function throttle(func,wait){
            var timeStart = 0 ;
            return function(){
              let _this = this;
              let args = [...arguments];
              let now = Date().now();
              if(now - timeStart >wait){
                func.apply(_this,args);
                timeStart = now;
              }
            }
          }

          實現一個promise

              function _Promise(func){
                  this.status = 'pending'
                  this.result = '' ;
                  func(this.resolve.bind(this),this.reject.bind(this));
              }
              _Promise.prototype.resolve = function(result){
                  if(this.status == 'pending'){
                      this.status = 'fullfilled';
                      this.result = result;
                  }
              }
              _Promise.prototype.reject = function(error){
                  if(this.status == 'pending'){
                      this.status = 'rejected';
                      this.result = error;
                  }
              }
              _Promise.prototype.then = function(preResolve,preReject){
                  let _isPromise ;
                  if(this.status == 'fullfilled'){
                      _isPromise = preResolve(this.result);
                  }else if(this.status == 'rejected' && arguments[1]){
                       _isPromise = preReject(this.result);
                  }
                  return _isPromise instanceof _Promise ? _isPromise:this;
              }

          實現一個promise.all()

           function promiseAll(promiseArray){
                  //首先參數一定是一個數組
                  //然后此函數返回的是一個promise,如果全部成功,則返回結果的數組,只要有一個失敗,則返回失敗的結果
                  return new Promise(function (resolve,reject){
                      if(!Array.isArray(promiseArray)){
                          return reject(new TypeError("not a function"));
                      }
                      let resolveNum = 0;
                      let arrNum = promiseArray.length;
                      let resolveResult = [];
                      for(let i=0; i<arrNum ;i++){
                          (function (i){
                              Promise.resolve(promiseArray[i]).then(function(result){
                                  resolveNum ++;
                                  resolveResult.push(result);
                                  if(resolveNum == arrNum){
                                      return resolve(resolveResult);
                                  }
                              },function(error){
                                  return reject(error);
                              })
                          })(i);
                      }
                  }) //返回的promise結束
                  
              }
          藍藍設計www.sdgs6788.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 平面設計服務

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.sdgs6788.com

          存檔

          日日躁夜夜躁狠狠久久AV| 亚洲精品无码久久一线| 狠狠色噜噜狠狠狠狠狠色综合久久| 性欧美大战久久久久久久久| 亚洲精品无码久久久久| 久久国产精品成人片免费| 九九热久久免费视频| 久久久精品国产| 国产产无码乱码精品久久鸭| 天天综合久久久网| 久久久久精品国产亚洲AV无码 | 中文字幕亚洲综合久久| 久久精品国产精品亚洲| 伊人色综合久久天天人手人婷 | 久久久久亚洲精品日久生情| 看久久久久久a级毛片| 激情久久久久久久久久| 亚洲精品乱码久久久久久蜜桃图片 | 精品无码久久久久国产动漫3d| 99久久婷婷国产综合亚洲| 久久久久亚洲AV成人网人人软件| 国内精品综合久久久40p| 久久97久久97精品免视看| 久久99精品国产麻豆| 久久精品免费大片国产大片| 俺来也俺去啦久久综合网| 欧美日韩精品久久久免费观看| 国产综合久久久久久鬼色| 久久综合色老色| 一本久久免费视频| 久久久网中文字幕| 国产亚洲色婷婷久久99精品91| 亚洲AV日韩AV永久无码久久| 久久福利资源国产精品999| 亚洲欧美成人久久综合中文网| 久久国产精品二国产精品| 欧美精品一区二区精品久久| 久久久国产打桩机| 久久青青草原国产精品免费| 久久精品国产色蜜蜜麻豆| 久久99精品国产一区二区三区|