因为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行.
大.
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;