util.bind = function (func, context) {
if (util.isFunction(Function.prototype.bind)) { // util.isFunction是判断类型是否是函数,
return Function.prototype.bind.apply(func, Array.prototype.slice.call(arguments, 1)); // Function.prototype.bind是一个函数,绑定func里面的this,apply是对func函数进行调用,后面的Array.prototype.slice.call是对伪数组切割,并将参数
// 传递给func
}
if (arguments.length < 2 && util.isUndefined(arguments[0])) { //伪数组长度小于2,并且第一个参数由意义,直接返回func本身
return func;
}
var __method = func,
args = Array.prototype.slice.call(arguments, 2); // 对参数的前两个进行切割,留下剩下的
return function () { // 返回一个函数
var a = merge(args, arguments);
return __method.apply(context, a); 绑定context,并且向__method,也就是func方法里面传递a
};
};
merge = function (array, args) {
array = Array.prototype.slice.call(array, 0); //保留前面剩下的所有参数,将其变成数组
return update(array, args);
};
update = function (array, args) {
var arrayLength = array.length,
length = args.length;
while (length--) { // 对参数的长度进行递减,一直到0,0代表着false
array[arrayLength + length] = args[length];将所有的参数重新赋值给array,举个例子,原来的arguments是[1,2,3,4],切割后是[3,4],最后变成[3,4,1,2,3,4],也就是上面a的值
}
return array;
};