我有一个功能:
Function.prototype.bind = function() {
var fn = this;
var args = Array.prototype.slice.call(arguments);
var object = args.shift();
return function(){
return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)));
};
};
如果我这样做:
var l = [1, 2, {one: one}];
console.log(array.prototype.slice.call(l).concat(array.prototype.slice.call(l)));
我得到双倍的内容。你能解释一下这个神奇的陈述在上面的函数中的含义吗?
答案 0 :(得分:4)
您的示例与以下代码之间的区别在于,在下面的代码中,参数值在两行中都不相同:
Function.prototype.bind = function() { // f1
var fn = this;
var args = Array.prototype.slice.call(arguments); // arguments of f1
var object = args.shift();
return function(){ // f2
return fn.apply(object, args.concat(Array.prototype.slice.call(arguments))); // arguments of f2
};
};
评论了一个用例,以帮助您理解:
// Usage:
var boundFunc = func.bind(obj, arg1, arg2);
boundFunc(arg3, arg4);
Function.prototype.bind = function() { // f1
var fn = this; //fn will be initialized to func
var args = Array.prototype.slice.call(arguments); // args will be [obj, arg1, arg2]
var object = args.shift(); // object will be obj, args will be [arg1, arg2]
return function(){ // f2
// arguments is array-like [arg3, arg4]
var allArgs = args.concat(Array.prototype.slice.call(arguments)) // allArgs is [arg1, arg2, arg3, arg4]
return fn.apply(object, allArgs); // func called with obj as this and arg1, arg2, arg3, arg4 as arguments
};
};
注意:
使用0参数(或0作为参数)调用时, Array.prototype.slice
会创建传递给它的数组的克隆。它也可以在类似数组的对象上作为参数或NodeList对象调用,以创建具有相同项的数组。