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

currying相關(guān)的一個問題,[this].concat([].slice.call(arguments)) 沒看懂這個語句?

題目描述

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

題目來源及自己的思路

《你不知道的JavaScript(中卷)》的書中“回調(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í)際看到的錯誤信息又是什么?

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

arguments是函數(shù)里所有參數(shù)的數(shù)組集可以用下標(biāo)訪問對應(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的寫法就是[].slice.call(arguments)
ES6的寫法:具體可以看阮一峰的ES6

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

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)建一直有用,所以會有orig_fn.bind,而bind的第一個參數(shù)當(dāng)然就是this咯,所以我要的結(jié)果就是orig_fn.bind(this,arg1,agr2),那要怎么做呢,自然就是apply了,剩下就沒啥了吧。

2018年1月18日 21:15