<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          柯里化、原生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.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、網站建設 、平面設計服務

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合