下面小編就為大家?guī)硪黄猨avascript中利用柯里化函數實現bind方法【推薦】。小編覺得挺不錯的,現在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
• 柯理化函數思想:一個js預先處理的思想;利用函數執(zhí)行可以形成一個不銷毀的作用域的原理,把需要預先處理的內容都儲存在這個不銷毀的作用域中,并且返回一個小函數,以后我們執(zhí)行的都是小函數,在小函數中把之前預先存儲的值進行相關的操作處理即可;
• 柯里化函數主要起到預處理的作用;
• 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方法【推薦】就是小編分享給大家的全部內容了,希望能給大家一個參考
版權所有:易賢網