鍍金池/ 問(wèn)答/PHP  HTML/ 實(shí)現(xiàn)bind函數(shù)的柯里化問(wèn)題

實(shí)現(xiàn)bind函數(shù)的柯里化問(wèn)題

快速實(shí)現(xiàn)一個(gè)一般是:

Function.prototype.bind = function (context) {
    var me = this;
    var argsArray = Array.prototype.slice.call(arguments);
    return function () {
        return me.apply(context, argsArray.slice(1))
    }
}

但是最近看了一篇文章,說(shuō)這種會(huì)
clipboard.png
預(yù)設(shè)參數(shù)功能丟失是什么意思?

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);
    }
}

為什么還要搞一個(gè)innerArgs,柯里化?

請(qǐng)大神舉下具體場(chǎng)景講解下。感謝

回答
編輯回答
玩控

你的第一種 調(diào)用新函數(shù) 參數(shù)無(wú)用

function test(a){
    console.log(a);
}

var newTest = test.bind();
newTest(1);
2018年2月22日 11:10
編輯回答
你的瞳

原生的bind是可以使一個(gè)函數(shù)具有預(yù)設(shè)初始參數(shù),也就是實(shí)現(xiàn)偏函數(shù)

function sum(a, b) {
    console.log(a + b)
}

var sum2 = sum.bind(null,2);   // 固定參數(shù)a, 值為2
sum2(4)                        // 傳入?yún)?shù)b, 值為4, 結(jié)果為6

而你模仿實(shí)現(xiàn)的第一個(gè)bind方法不具有這個(gè)功能,往bind返回的函數(shù)(sum2)傳參并沒(méi)有效果。
第二個(gè)bind方法就實(shí)現(xiàn)了這種預(yù)設(shè)初始參數(shù)的功能。sum2函數(shù)傳入?yún)?shù)4,參數(shù)會(huì)被收集,并跟一開(kāi)始使用bind方法傳入的參數(shù)2合并到一起,然后再傳給sum函數(shù). 實(shí)現(xiàn)了sum(2, 4)的效果.

MDN上有bind關(guān)于偏函數(shù)的應(yīng)用講解,可以再去看看.

有講得不好的地方,請(qǐng)指出.

2017年10月31日 00:36
編輯回答
淺時(shí)光

預(yù)設(shè)參數(shù)就是你開(kāi)始綁定的時(shí)候,指定的前面的參數(shù),后面就不需要再傳了
innerArgs是你后面調(diào)用的時(shí)候,傳的參數(shù)

2017年6月18日 23:11
編輯回答
命多硬
    function a () {console.log(arguments)}
    // 上面兩種bind試一下運(yùn)行,就可以看到差別了
    var b = a.bind(null, 1, 2)
    b(3,4)
2017年4月9日 10:30