函數式編程
2019-03-19 17:13:41
快速實現一個一般是: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
提交
取消