因为bind不是一个跨浏览器(旧的)功能,所以它有一个polyfill:(来自John Resig的书)
/*1*/ Function.prototype.bind = function ()
/*2*/ {
/*3*/ var fn = this,/*4*/ args = Array.prototype.slice.call(arguments),/*5*/ object = args.shift();
/*6*/ return function ()
/*7*/ {
/*8*/ return fn.apply(object,/*9*/ args.concat(Array.prototype.slice.call(arguments)));
/*10*/ };
/*11*/ };
但是我不明白为什么我们需要#9行的参数.
我的意思是 :
如果我有这个对象:
var foo = {
x: 3
}
我有这个功能:
var bar = function(p,b){
console.log(this.x+' '+p+' '+b);
}
所以,如果我想要bar在foo上下文中运行,使用参数 – 所有我需要做的是:
var boundFunc = bar.bind(foo,1,2) boundFunc ()...
所以当我运行var.bind(foo,2)时,参数是[object Object],2.
这些参数保存在第4行.
大.
现在,bind函数返回自己的关闭函数:
function ()
{
return fn.apply(object,args.concat(Array.prototype.slice.call(arguments)));
}
题
为什么我们需要论证?它似乎是为了像这样的东西:
var boundFunc = bar.bind(foo,2) boundFunc (more1,more2....) //<----- ??
我错过了什么吗?
Oonce我设置了第一个var boundFunc = bar.bind(foo,2),我已经声明了参数.为什么我们需要两次?
解决方法
有两个地方可以将参数传递给绑定函数:
1)当你调用bind(第一个参数)时.这些被调用时总是应用于绑定函数.
2)当你调用绑定函数(第二个参数)时.这些是你提到的“more1,more2”.这些变化取决于调用绑定参数时提供的内容.
第9行将原始绑定参数与提供的额外参数组合.
我猜你可能会困惑的概念是你最初不必绑定所有的参数 – 你只能绑定上下文对象,或者你也可以绑定第一个参数,但是绑定函数的调用者提供其余的.例如:
function sum() {
var _sum = 0
for (var i = 0; i < arguments.length ; i++) {
_sum += arguments[i];
}
return _sum;
}
var sum_plus_two = sum.bind({},2);
sum_plus_two(5,7) == 14;