从: http://ejohn.org/apps/learn/#2

Function.prototype.bind = function(){
  var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
  return function(){
    return fn.apply(object,
      args.concat(Array.prototype.slice.call(arguments)));
  };
};

谁能告诉我为什么需要第二次回报(在fn.apply之前)?

另外,谁能解释为什么args.concat有必要?为什么不被重写为:

fn.apply(object, args)

代替

return fn.apply(object,
          args.concat(Array.prototype.slice.call(arguments)));
有帮助吗?

解决方案

第二个返回是必要的,因为否则我们将失去界限功能的任何回报值。

您可能已经知道这一点,但没有提及。如果我们不包装 fn.apply 在另一个功能中,我们直接调用该功能 fn 这是亚最佳的 bind 仅应该设置执行上下文(应该什么 this 请参阅功能内部),而不是调用它。

可以通过调用JavaScript方法来调用 call 或者 apply 他们的方法。这是一个小例子:

function example() {
    alert("useless example");
}

example.apply() // or example.call(), alerts "useless example";

原型bind()中的外部函数应该像绑定函数周围的看不见的包装器一样工作。因此,将传递给包装器的任何参数也应传递给界函数,并且必须返回绑定函数返回的任何值,这就是返回语句存在的原因。

在fn中进行args.concat的原因是不同的,并且不是可选的。 bind 在原型中,您可以将参数预定到绑定函数。

args 代表我们打电话时通过的论点 bind 在功能上。 arguments 代表我们调用绑定函数时通过的参数。我们基本上是在那里串联两个阵列。

从上面的示例中:

var obj = { x: 'prop x' };
var boundExample = example.bind(obj, 12, 23); // args => 12, 23
boundExample(36, 49); // arguments => 36, 49

// arguments that our example() function receives => 12, 23, 36, 49

其他提示

旧帖子,但一种较新的方法;)

Function.prototype.bind = function(){
    var fn = this, 
    context = arguments[0], 
    args = Array.prototype.slice.call(arguments, 1);
    return function(){
        return fn.apply(context, args.concat([].slice.call(arguments)));
    }
}

obj = {'abc':'x'};
var func = function() {
  console.log(arguments);
  alert(this.abc);
}
var x = func.bind(obj);

console.log(x(1,2,3));

这是一个很好的例子。运行并检查控制台日志。然后修改代码以排除

[].slice.call(arguments)

您会看到x(1,2,3)执行的控制台.log不再显示参数。 这是因为参数对象是所有函数中的局部变量。 这听起来可能有些混乱,但这基本上是:

var x = func.bind(obj,1,2,3);

内部返回此功能:

function() {
    return fn.apply(obj, [1,2,3].concat([].slice.call(arguments)));
}

因此,它更多是该功能的模板。

当您现在运行时,它像以下方式:

x(4,5,6)

这将被运行:

fn.apply(obj, [1,2,3].concat([].slice.call(arguments)))

使用特殊参数对象= {0:4,1:5,2:6},可以使用[] .slice.call转换为阵列,其中参数是本地对象,在调用期间自动分配了bee bee功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top