首頁  >  文章  >  web前端  >  javascript中利用柯里化函數實作bind方法

javascript中利用柯里化函數實作bind方法

PHPz
PHPz原創
2016-05-16 15:02:561175瀏覽

下面小編就為大家帶來一篇javascript中利用柯里化函數實作bind方法。小編覺得蠻不錯的,現在分享給大家,也給大家做個參考,一起跟著小編過來看看吧。

• 柯理化函數思想:一個js預先處理的思想;利用函數執行可以形成一個不銷毀的作用域的原理,把需要預先處理的內容都儲存在這個不銷毀的作用域中,並且傳回一個小函數,以後我們執行的都是小函數,在小函數中把之前預先儲存的值進行相關的運算處理即可;

• 柯里化函數主要起到預處理的作用;

• bind方法的作用:把傳遞進來的callback回調方法中的this預先處理為上下文context;

/**
* bind方法实现原理1
* @param callback [Function] 回调函数
* @param context [Object] 上下文
* @returns {Function} 改变this指向的函数
*/
function bind(callback,context) {
  var outerArg = Array.prototype.slice.call(arguments,2);// 表示取当前作用域中传的参数中除了fn,context以外后面的参数;
  return function (){
    var innerArg = Array.prototype.slice.call(arguments,0);//表示取当前作用域中所有的arguments参数;
    callback.apply(context,outerArg.concat(innerArg));
  }
}
/**
* 模仿在原型链上的bind实现原理(柯理化函数思想)
* @param context [Object] 上下文
* @returns {Function} 改变this指向的函数
*/
Function.prototype.mybind = function mybind (context) {
  var _this = this;
  var outArg = Array.prototype.slice.call(arguments,1);
  // 兼容情况下
  if('bind' in Function.prototype) {
    return this.bind.apply(this,[context].concat(outArg));
  }
  // 不兼容情况下
  return function () {
    var inArg = Array.prototype.slice.call(arguments,0);
    inArg.length === 0?inArg[inArg.length]=window.event:null;
    var arg = outArg.concat(inArg);
    _this.apply(context,arg);
  }
}

以上就是javascript利用柯里化函數實現bind方法的全部內容了,希望能給大家一個參考。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn