快速实现一个一般是:Function.prototype.bind = function (context) { var me = this; var argsArray = Array.prototype.slice.call(arguments); return function () { return me.apply(context, argsArray.slice(1)) }}但是最近看了一篇文章,说这种会预设参数功能丢失是什么意思?Function.prototype.bind = Function.prototype.bind || function (context) { var me = this; var args = Array.prototype.slice.call(arguments, 1); return function () { var innerArgs = Array.prototype.slice.call(arguments); var finalArgs = args.concat(innerArgs); return me.apply(context, finalArgs); }}为什么还要搞一个innerArgs,柯里化?请大神举下具体场景讲解下。感谢
4 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
原生的bind是可以使一个函数具有预设初始参数,也就是实现偏函数
function sum(a, b) {
console.log(a + b)
}
var sum2 = sum.bind(null,2); // 固定参数a, 值为2
sum2(4) // 传入参数b, 值为4, 结果为6
而你模仿实现的第一个bind方法不具有这个功能,往bind返回的函数(sum2)传参并没有效果。
第二个bind方法就实现了这种预设初始参数的功能。sum2函数传入参数4,参数会被收集,并跟一开始使用bind方法传入的参数2合并到一起,然后再传给sum函数. 实现了sum(2, 4)的效果.
MDN上有bind关于偏函数的应用讲解,可以再去看看.
有讲得不好的地方,请指出.
阿波罗的战车
TA贡献1862条经验 获得超6个赞
你的第一种 调用新函数 参数无用
function test(a){
console.log(a);
}
var newTest = test.bind();
newTest(1);
繁华开满天机
TA贡献1816条经验 获得超4个赞
function a () {console.log(arguments)}
// 上面两种bind试一下运行,就可以看到差别了
var b = a.bind(null, 1, 2)
b(3,4)
添加回答
举报
0/150
提交
取消