array.prototype.slice.call(X).concat(array.prototype.slice.call(X))的魔力

时间:2013-11-20 09:14:20

标签: javascript

我有一个功能:

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)));

我得到双倍的内容。你能解释一下这个神奇的陈述在上面的函数中的含义吗?

1 个答案:

答案 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对象调用,以创建具有相同项的数组。