亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實現bind函數的柯里化問題

實現bind函數的柯里化問題

函數式編程 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關于偏函數的應用講解,可以再去看看.


有講得不好的地方,請指出.


查看完整回答
反對 回復 2019-03-24
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

預設參數就是你開始綁定的時候,指定的前面的參數,后面就不需要再傳了
innerArgs是你后面調用的時候,傳的參數

查看完整回答
反對 回復 2019-03-24
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

你的第一種 調用新函數 參數無用


function test(a){

    console.log(a);

}


var newTest = test.bind();

newTest(1);


查看完整回答
反對 回復 2019-03-24
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

    function a () {console.log(arguments)}

    // 上面兩種bind試一下運行,就可以看到差別了

    var b = a.bind(null, 1, 2)

    b(3,4)


查看完整回答
反對 回復 2019-03-24
  • 4 回答
  • 0 關注
  • 833 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號