FreeCodeCamp筆記之:Arguments Optional

題目

創(chuàng)建一個(gè)計(jì)算兩個(gè)參數(shù)之和的 function。如果只有一個(gè)參數(shù),則返回一個(gè) function,該 function 請(qǐng)求一個(gè)參數(shù)然后返回求和的結(jié)果。例如,add(2, 3)應(yīng)該返回5,而add(2)應(yīng)該返回一個(gè) function。調(diào)用這個(gè)有一個(gè)參數(shù)的返回的 function,返回求和的結(jié)果:var sumTwoAnd = add(2);sumTwoAnd(3)返回5。如果兩個(gè)參數(shù)都不是有效的數(shù)字,則返回 undefined。如果你被卡住了,記得開大招 Read-Search-Ask。嘗試與他人結(jié)伴編程、編寫你自己的代碼。
這是一些對(duì)你有幫助的資源:
Closures
Arguments object

思路

  1. 解題:如果這個(gè)對(duì)象有2個(gè)參數(shù),且兩個(gè)參數(shù)都是數(shù)值,則兩個(gè)參數(shù)相加;
  2. 任意一個(gè)參數(shù)不是數(shù)值,就返回 undefined;
  3. 如果只有一個(gè)參數(shù),則返回一個(gè)函數(shù),這個(gè)函數(shù),這個(gè)函數(shù)被調(diào)用時(shí),返回求和的結(jié)果( 這一段話理解了N久,什么鬼);
  4. 題目提示 Closures,Arguments object 兩個(gè)函數(shù);其中 Arguments object 比較好理解,因?yàn)樾枰獙⒑瘮?shù)的2個(gè)參數(shù)轉(zhuǎn)為數(shù)組,來進(jìn)行計(jì)算;但 Closures 這個(gè)實(shí)在是太抽象了;
  5. 百度了好多,理解下來,閉包有這種特性:

閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量,利用閉包可以突破作用鏈域,將函數(shù)內(nèi)部的變量和方法傳遞到外部。
閉包的特性:

  • 函數(shù)內(nèi)再嵌套函數(shù)
  • 內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
  • 參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收
  1. 其實(shí)還是不是很明白,看來要多加練習(xí)

解答

function add() {
var arr = Array.prototype.slice.call(arguments); // 將參數(shù)轉(zhuǎn)為數(shù)組
  var val = arr.every(function(item) {  //判斷數(shù)組的每一個(gè)元素是否都是數(shù)字
 return Number.isFinite(item);
});
  if (!val){
    return undefined;                    //如果不是數(shù)組,返回undefined
  } else {
    if (arr.length===2){                  // 如果數(shù)組有2個(gè)元素,即函數(shù)有2個(gè)參數(shù)
      return arr[0]+arr[1];               //將2個(gè)參數(shù)相加;
    } else{
      var arr2 = arr[0];                  //否則取得第一個(gè)元素
      return function(Two){               //定義一個(gè)新的函數(shù)(這里是否就是所謂的Closures??);
        if (Number.isFinite(Two)){        //判斷這個(gè)函數(shù)傳入的參數(shù)是否為數(shù)字
          return arr2 + Two ;             //正常則將這個(gè)參數(shù)與上一個(gè)函數(shù)的唯一的參數(shù)相加;
        } else{
          return undefined;               //如果這個(gè)新函數(shù)的參數(shù)不是數(shù)字,則返回undefined;
        }
      };
    }
  }    
}
add(2,3);
  • 寫到判斷是否數(shù)值的時(shí)候,又卡住了;百度之后發(fā)現(xiàn)需要使用 isFinite() ;
  • 程序?qū)懲昴軌驁?zhí)行,并返回正確結(jié)果;但閉包這個(gè)概念還是不是很懂;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容