ES6 函數(shù)

參數(shù)默認(rèn)值: 如果沒有傳參數(shù)就相當(dāng)于傳的是 undefined, 不能是 null, 因?yàn)闀?huì)被解構(gòu)為 0

function sum(a, b = 2, c = 3) {
  return a + b + c;
}
sum(11); // 16 , 這就相當(dāng)于sum(11, undefined, undefiend), 但是必須是undefined,他才給你解析為默認(rèn)值憎茂, 不然傳null的話 (sum(11, null, null) = 11)珍语,它會(huì)給你解析為0

面試題

function test() {
  console.log("abc");
  return document.getElementsByClassName("container")[0];
}

function createEle(ele = "div", container = test(), content = "何難勛最帥") {
  const el = document.createElement(ele);
  if (content) {
    el.innerText = content;
  }
  container.appendChild(el);
}

// 打印兩次, 因?yàn)榍懊鎯纱味紓鞯氖莡ndefined, 所以使用默認(rèn)值竖幔,執(zhí)行test()板乙,第三次傳了值,就用傳入的值拳氢,不執(zhí)行test
createEle(undefined, undefined, undefined);
createEle(undefined, undefined, "何難勛");
createEle(undefined, document.querySelector(".wrapper"));

擴(kuò)展

  1. 參數(shù)對(duì)于在嚴(yán)格模式下不一樣亡驰,傳參進(jìn)來,如果在非嚴(yán)格模式下饿幅,你在函數(shù)里面修改了值凡辱,它的 arguments 里面的值也會(huì)變淌山,但是在嚴(yán)格模式下揖闸,他們兩個(gè)是脫離的盈简,你定義的值缔俄,arguments 里面的值不會(huì)變

    注意點(diǎn): 如果設(shè)置了默認(rèn)值埃篓,該函數(shù)會(huì)自動(dòng)變?yōu)樵趪?yán)格模式下執(zhí)行歉眷,arguments 和形參脫離袱蜡, 所以盡量不要使用 arguments叙淌,因?yàn)榭赡軙?huì)造成一些問題

function test (a, b) {
    console.log(arguments[0], arguments[1]) // 1, 2
    a = 3
   console.log(arguments[0], arguments[1]) // 3, 2
   console.log(a, b) // 3,2
}

test(1,2)


'use strict'   ------------嚴(yán)格模式下
function test (a, b) {
    console.log(arguments[0], arguments[1]) // 1, 2
    a = 3
   console.log(arguments[0], arguments[1]) // 1 , 2  : 在嚴(yán)格模式下市咆,arguments的值不變
   console.log(a, b) // 3,2
}

test(1,2)


  1. 留意暫時(shí)性死區(qū)
    • 形參和 ES6 中的 let 和 const 聲明一樣汉操,具有作用域,并且根據(jù)參數(shù)的聲明順序存在暫時(shí)性死區(qū)
function test(a, b = a) {
  console.log(a, b);
}
test(1, 2); // 1, 2 ; 因?yàn)槎紓魅肓酥得衫迹圆粫?huì)使用默認(rèn)值
test(1); // 1, 1 ; 因?yàn)閍已經(jīng)被定義為1了磷瘤,所以執(zhí)行到b的時(shí)候,能拿到a的值

function test(a = b, b) {
  console.log(a, b);
}
test(1, 2); // 1, 2 ; 因?yàn)槎紓魅肓酥邓驯洌圆粫?huì)使用默認(rèn)值
test(1); // 報(bào)錯(cuò)采缚,會(huì)說b還沒初始化就被調(diào)用

注意: let 在函數(shù)內(nèi)部定義變量,不能和形參同名挠他,否則會(huì)報(bào)錯(cuò)

剩余函數(shù): ES6 的剩余參數(shù)專門用于收集末尾的所有參數(shù)扳抽,將其放置到一個(gè)形參數(shù)組中;

解決的問題:

剩余參數(shù):
  解決問題:
   - arguments:
            1. 如果和形參配合使用殖侵,容易導(dǎo)致混亂贸呢,eg:在形參沒有設(shè)置默認(rèn)值的情況下,在函數(shù)里面修改了形參的值之后拢军,arguments里面的值也會(huì)變楞陷; 但是設(shè)置了默認(rèn)值之后,函數(shù)就自動(dòng)變?yōu)榱?嚴(yán)格模式',形參和實(shí)參就會(huì)相互脫離朴沿,你修改值不會(huì)改變arguments的值
            2. 從語義上猜谚,使用arguments獲取參數(shù)败砂,由于形參缺失,無法從函數(shù)定義上理解函數(shù)的真實(shí)意圖

    - 就是寫的函數(shù)讓調(diào)用者爽魏铅,不用給它規(guī)定傳什么類型昌犹,如一般我們的方法會(huì)要求傳數(shù)組...
用來代替arguments,不僅讓調(diào)用者不用關(guān)注是什么類型,任意傳值览芳,然后就是arguments的缺陷斜姥,

// 收集參數(shù): 一定是收集最后的參數(shù)的
function test(...args) {
  // args收集了所有的參數(shù),形成了一個(gè)數(shù)組
}

*細(xì)節(jié)

// 數(shù)組克隆
var arr = [...arr1]

// 對(duì)象淺克隆沧竟,沒有進(jìn)行深層次的克隆铸敏,也就是第二層對(duì)象就相同了
var obj = {...obj1}


// 對(duì)象淺克隆,沒有進(jìn)行深層次的克隆悟泵,也就是第二層對(duì)象就相同了
// eg:
var obj = { name: 'hnx', obj1: { age: 18}}
var obj2 = {...obj, name: 'xtf' }
obj1.obj1 == obj.obj1 // true , 原因是它只是展開了第一層次杈笔,而沒有展開第二層

*展開: ...

function test(a, b, c) {
    console.log(a, b, c)
}
var arr = ['adf', 'af', 'affgd']
test(...arr) // 將arr展開傳入

*柯里化

function cal(a, b, c, d) {
    return a + b * c - d
}
// cal(1,2, 3, 4)
// cal(1,2, 4, 5)
// cal(1,2, 6, 7)
// cal(1,2, 8, 9)
// 調(diào)用的時(shí)候前兩個(gè)參數(shù)都是一樣,那就用一個(gè)curry方法糕非,將固定的參數(shù)拿出去蒙具,返回一個(gè)新的函數(shù)執(zhí)行剩余的參數(shù)

const newCal = curry(cal, 1, 2)
console.log(newCal(3, 4)) //1 + 2 * 3 - 4
console.log(newCal(4, 5)) //1 + 2 * 4 - 5
console.log(newCal(6, 7)) //1 + 2 * 6 - 7
console.log(newCal(8, 9)) //1 + 2 * 8 - 9

const newCal2 = newCal(3)
console.log(newCal2(9)) // 1 + 2 * 3 - 9 參數(shù)不夠,那繼續(xù)返回一個(gè)函數(shù)再次執(zhí)行朽肥,直到參數(shù)傳完禁筏,才結(jié)束


// curry: 柯里化,用戶固定某個(gè)函數(shù)的前面的參數(shù)衡招,得到一個(gè)新的函數(shù)篱昔,新的函數(shù)調(diào)用時(shí),接受剩余的參數(shù)
function curry(fn, ...args) {
    // console.log(args) // 是一個(gè)數(shù)組
    return function (...subArgs) {
        // 判斷參數(shù)是否傳完始腾,就將兩個(gè)數(shù)組加起來的長度看是否大于fn形參的長度
        // 拼接的方法
        // 1. const allArgs = [...args, ...subArgs] 
        const allArgs = args.concat(subArgs);
        if (allArgs.length >= fn.length) {
            // 參數(shù)夠了
            return fn(...allArgs)
        } else {
            // 參數(shù)不夠
            return curry(fn, ...allArgs)
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末州刽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窘茁,更是在濱河造成了極大的恐慌怀伦,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山林,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡邢羔,警方通過查閱死者的電腦和手機(jī)驼抹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拜鹤,“玉大人框冀,你說我怎么就攤上這事∶舨荆” “怎么了明也?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宣虾,是天一觀的道長。 經(jīng)常有香客問我温数,道長绣硝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任撑刺,我火速辦了婚禮鹉胖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘够傍。我一直安慰自己甫菠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布冕屯。 她就那樣靜靜地躺著寂诱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪安聘。 梳的紋絲不亂的頭發(fā)上痰洒,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音搞挣,去河邊找鬼带迟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛囱桨,可吹牛的內(nèi)容都是我干的仓犬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舍肠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搀继!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翠语,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤叽躯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后肌括,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體点骑,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年谍夭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黑滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡紧索,死狀恐怖袁辈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情珠漂,我是刑警寧澤晚缩,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布尾膊,位于F島的核電站,受9級(jí)特大地震影響荞彼,放射性物質(zhì)發(fā)生泄漏冈敛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一卿泽、第九天 我趴在偏房一處隱蔽的房頂上張望莺债。 院中可真熱鬧,春花似錦签夭、人聲如沸齐邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽措拇。三九已至,卻和暖如春慎宾,著一層夾襖步出監(jiān)牢的瞬間丐吓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工趟据, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留券犁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓汹碱,卻偏偏與公主長得像粘衬,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咳促,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前稚新,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法跪腹。 上面代碼檢查函數(shù)l...
    呼呼哥閱讀 3,398評(píng)論 0 1
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法 在ES6之前褂删,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法冲茸。 上面代碼檢查函數(shù)l...
    陳老板_閱讀 449評(píng)論 0 1
  • 1.函數(shù)參數(shù)的默認(rèn)值 (1).基本用法 在ES6之前屯阀,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法轴术。
    趙然228閱讀 693評(píng)論 0 0
  • 函數(shù)參數(shù)的默認(rèn)值 基本用法ES6 之前蹲盘,不能直接為函數(shù)的參數(shù)指定默認(rèn)值,只能采用變通的方法膳音。 為了避免這個(gè)問題,通...
    焦邁奇閱讀 181評(píng)論 0 0
  • ES6函數(shù)的擴(kuò)展 1.函數(shù)默認(rèn)值 定義:ES6允許為函數(shù)設(shè)定默認(rèn)值铃诬,即直接寫在參數(shù)定義的后面 示例function...
    lijaha閱讀 407評(píng)論 0 0