鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ currying相關(guān)的一個(gè)問(wèn)題,[this].concat([].slice.c

currying相關(guān)的一個(gè)問(wèn)題,[this].concat([].slice.call(arguments)) 沒(méi)看懂這個(gè)語(yǔ)句?

題目描述

函數(shù)asyncify是一個(gè)無(wú)論異步調(diào)用它還是同步調(diào)用它,輸出結(jié)果都相同的函數(shù)(本案例中 a = 1),關(guān)于同步的那個(gè)判斷,不太理解其中的邏輯含義, 特別是 [this].concat([].slice.call(arguments)) 這個(gè)語(yǔ)句,書(shū)中解釋說(shuō),這個(gè)叫currying,后來(lái)我查過(guò),大致意思就是可以連續(xù)傳入?yún)?shù),后來(lái)還是沒(méi)有看懂這個(gè)語(yǔ)句

題目來(lái)源及自己的思路

《你不知道的JavaScript(中卷)》的書(shū)中“回調(diào)”章節(jié)的案例

相關(guān)代碼

function asyncify(fn) {
      var orig_fn = fn,
          intv = setTimeout(function () {
                    intv = null;
                    if (fn) fn();
                 }, 0);
      console.log('Wai intv:'+intv);
      fn = null;
      return function () {
        console.log('Nei intv:'+intv);
        if (intv) {
          // 同步
          fn = orig_fn.bind.apply(
            orig_fn,
            // 把封裝器的this添加到bind(..)調(diào)用的參數(shù)中,
            // 以及克里化(currying)所有傳入?yún)?shù)
            [this].concat([].slice.call(arguments))  
          );
        } else {
          // 異步
          orig_fn.apply(this, arguments); 
        }
      };
    }
    function result(data) {
      console.log(a); 
    }

    var a = 0;
    var b = asyncify(result);
    a++;

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

返回的結(jié)果為 1,實(shí)現(xiàn)了書(shū)中的要求
回答
編輯回答
做不到

arguments是函數(shù)里所有參數(shù)的數(shù)組集可以用下標(biāo)訪問(wèn)對(duì)應(yīng)的參數(shù)。[].slice.call(arguments)這是argument調(diào)用數(shù)組的slice方法。 [this].concat([].slice.call(arguments))就是先slice再concat

2017年11月28日 11:47
編輯回答
孤慣

我猜你是 [].slice.call(arguments) 這里不理解吧
arguments不是真正的數(shù)組,需要轉(zhuǎn)換:es5的寫(xiě)法就是[].slice.call(arguments)
ES6的寫(xiě)法:具體可以看阮一峰的ES6

[1].concat([2,3]) 數(shù)組連接操作,這個(gè)容易明白吧

2018年1月30日 10:19
編輯回答
嘟尛嘴
 fn = orig_fn.bind.apply(
            orig_fn,
            [this].concat([].slice.call(arguments))  
          );

首先為了實(shí)現(xiàn)需求,asyncify(result);創(chuàng)建的新函數(shù)的newResult,當(dāng)然是一次創(chuàng)建一直有用,所以會(huì)有orig_fn.bind,而bind的第一個(gè)參數(shù)當(dāng)然就是this咯,所以我要的結(jié)果就是orig_fn.bind(this,arg1,agr2),那要怎么做呢,自然就是apply了,剩下就沒(méi)啥了吧。

2018年1月18日 21:15