7函數(shù)的擴(kuò)展

OLD函數(shù)默認(rèn)參數(shù)

// 缺點(diǎn):布爾值為false的變量都會被賦為默認(rèn)值
function fn(x) {
    x = x || 'hello'
}
// 比較麻煩
function fn (x) {
    if (typefo x === 'undefined') {
        x = 'hello'
    }
}

基本用法

在 ES2017 中,允許定義和調(diào)用函數(shù)時有缆,最后一個參數(shù)有,

惰性求值

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}

foo() // 100

x = 100;
foo() // 101

報錯情景

  1. 當(dāng)函數(shù)參數(shù)x有默認(rèn)值折剃,再在函數(shù)中聲明就會報錯
  2. 當(dāng)函數(shù)參數(shù)都沒有默認(rèn)值华临,允許參數(shù)同名是鬼。只要函數(shù)參數(shù)有一個就沒有默認(rèn)值,就不允許函數(shù)參數(shù)同名纲刀。
  3. 當(dāng)函數(shù)參數(shù)有對象解構(gòu)的情況项炼,函數(shù)對象中的屬性不能和其它參數(shù)同名
// 情景3 ---- 報錯
function fn (x,{x = 1,n = 2}={}) {
        console.log(x,n)
    }
fn('yy');

函數(shù)參數(shù)對象

function fn({x,y=1}) {
    console.log(x,y)
}
fn({}) // undefined,1
fn() // 報錯
  1. 報錯原因担平,當(dāng)沒有參數(shù)時,其實(shí)默認(rèn)參數(shù)為undefined锭部。對象和undefined發(fā)生解構(gòu)報錯暂论。
  2. 正確原因,傳入對象拌禾,發(fā)生解構(gòu)取胎,x沒有默認(rèn)解構(gòu)值,則為undefined,y有默認(rèn)解構(gòu)值湃窍,則為1
function fn({x,y=1} = {}) {
    console.log(x,y)
}
fn({}) // undefined,1
fn() // undefined,1
  1. fn()執(zhí)行過程如下
  • 調(diào)用fn闻蛀,沒有參數(shù),使用函數(shù)默認(rèn)參數(shù){}
  • 發(fā)生對象解構(gòu)您市,x沒有解構(gòu)默認(rèn)值觉痛,y有默認(rèn)解構(gòu)值
// 分析以下案例
// 寫法一
function m1({x = 0, y = 0} = {}) {
  return [x, y];
}

// 寫法二
function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

默認(rèn)值位置

  1. 應(yīng)該時函數(shù)的尾參數(shù)
  2. 有默認(rèn)值,會影響fn.length
  • 一般是fn.length - 默認(rèn)參數(shù)個數(shù)
  • 當(dāng)默認(rèn)參數(shù)不是尾參數(shù)茵休,fn.length是第一個默認(rèn)參數(shù)之前的參數(shù)的個數(shù)
  • 當(dāng)參數(shù)是...rest,fn.length是0

作用域

當(dāng)函數(shù)有默認(rèn)值時薪棒,參數(shù)會形成一個獨(dú)立的作用域

簡單案例

var x = 1;

function f(x, y = x) {
  console.log(y);
}

f(2) // 2

function ff (y = x) {
    console.log(y);
}
  1. 函數(shù)f的參數(shù)形成一個默認(rèn)作用域。函數(shù)初始化過程
  • 參數(shù)x被賦值為2
  • 參數(shù)y被賦值為x榕莺,在當(dāng)前作用域中找x俐芯,找到x = 2,因此y = 2
  1. 函數(shù)初始化過程
  • 沒有參數(shù)x
  • 參數(shù)y被賦值為x钉鸯,在當(dāng)前作用域中沒有x吧史,找到全局變量x,因此y = 1

參數(shù)為函數(shù)的案例

var x = 1;
function foo(x, y = function() { x = 2; }) {
  var x = 3;
  y();
  console.log(x);
}

foo() // 3
x // 1
  1. 函數(shù)初始化
  • 參數(shù)x沒有默認(rèn)值亏拉,因此扣蜻,在函數(shù)foo中再聲明x不會報錯
  • 在函數(shù)foo的參數(shù)作用域中,x先為undefined及塘,在調(diào)用y時,x是參數(shù)而不是全局變量x锐极,此時參數(shù)x改為2
  • 但是由于笙僚,在函數(shù)再次聲明了x,這個x完全不是參數(shù)灵再,因此函數(shù)foo打印x為3
  1. 當(dāng)去掉var x = 3肋层,函數(shù)foo的參數(shù),其實(shí)相當(dāng)于聲明并賦值參數(shù)x翎迁,沒有函數(shù)內(nèi)部變量x栋猖,參數(shù)x就會被打印。

rest參數(shù)

  1. 形式汪榔,function fn(...rest)
  2. rest參數(shù)是數(shù)組蒲拉,之后不允許有參數(shù)

嚴(yán)格模式

  1. 函數(shù)中可以使用use strict設(shè)置嚴(yán)格模式
  2. 當(dāng)函數(shù)參數(shù)有默認(rèn)值,解構(gòu)賦值,擴(kuò)展運(yùn)算符時雌团,不允許使用嚴(yán)格模式
  3. 有兩種方法可以規(guī)避以上規(guī)則
  • 全局嚴(yán)格模式
  • 在立即調(diào)用的函數(shù)中使用嚴(yán)格模式

name屬性

  1. name屬性使用方式fnName.name
function fn() {} // fn.name--->fn
var fn = function () {} // fn.name--->fn
var fn = function fun() {} // fn.name----->fun
fn.bind({},1) // fn.name---->bound fn
(new Function).name // ----> anonymous
(function () {}).name //---->''

箭頭函數(shù)

箭頭函數(shù)結(jié)構(gòu)

functionName = (arg1,arg2) => {arg1 + arg2};
  1. 其中函數(shù)名省略燃领,則為匿名函數(shù)
  2. 根據(jù)參數(shù)情況也可以省略
  • 當(dāng)沒有參數(shù)或者兩個及兩個以上參數(shù)時,(小括號不可省略
  • 當(dāng)有一個參數(shù)時锦援,小括號可以省略
  1. 當(dāng)函數(shù)體只有一條語句猛蔽,可以省略{大括號,并默認(rèn)有return返回灵寺。當(dāng)不需要返回值時
  • 即使一條語句也加上{曼库,這樣就沒有返回值
  • 使用void (一條語句),這樣也沒有返回值
var fn = (x,y) => x + y;
// 等價于
function fn (x,y) {
    return x + y;
} 

箭頭函數(shù)

  1. this固定略板,指向定義時的this
  2. 箭頭函數(shù)不能做構(gòu)造函數(shù)
  3. 不能使用arguments
  4. 不能使用yield毁枯,也就是箭頭函數(shù)不能做Generator

注意點(diǎn)

  1. 箭頭函數(shù)中沒有自己的this,只是引用外層的this
  2. 箭頭函數(shù)無法使用call(),apply(), bind()改變this執(zhí)行

分析過程(一)

function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

var id = 21;

foo.call({ id: 42 });
// result: 42
  1. 當(dāng)執(zhí)行foo.call({id: 42})內(nèi)部的this指向{id: 42}
  2. 此時蚯根,箭頭函數(shù)沒有自己的this后众。外部的this就是{id:42}
  3. 即使100毫秒后,在setTimeout中颅拦,this也不改變?yōu)?code>window

分析過程(二)

function foo() {
  setTimeout(function() {
    console.log('id:', this.id);
  }, 100);
}

var id = 21;

foo.call({ id: 42 });
// result: 21
  1. 普通函數(shù)蒂誉,this指向運(yùn)行時的上下文環(huán)境
  2. setTimeout偽代碼function setTimeout() {//delay... callback();},可以看到callback函數(shù),也就是普通函數(shù)的沒有綁定到其它對象上

尾調(diào)用

  1. 最后一步調(diào)用其它函數(shù)距帅,稱為尾調(diào)用
  2. 尾調(diào)用函數(shù)定義時右锨,不使用外層函數(shù)的變量
  3. 尾調(diào)用,有利于節(jié)約內(nèi)存
// 這種情況沒有使用外層函數(shù)的變量
function f() {
  let m = 1;
  let n = 2;
  return g(m + n);  // 最后一步用
}
f();
// 這種情況使用了外層函數(shù)的變量
function f() {
  let m = 1;
  function g(n) {
      return m + n;
  }
  return g(2);  // 最后一步用
}
f();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碌秸,一起剝皮案震驚了整個濱河市绍移,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌讥电,老刑警劉巖蹂窖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恩敌,居然都是意外死亡瞬测,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門纠炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來月趟,“玉大人,你說我怎么就攤上這事恢口⌒⒆冢” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵耕肩,是天一觀的道長因妇。 經(jīng)常有香客問我问潭,道長,這世上最難降的妖魔是什么沙峻? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任睦授,我火速辦了婚禮啤呼,結(jié)果婚禮上曙咽,老公的妹妹穿的比我還像新娘。我一直安慰自己邪码,他們只是感情好是复,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布删顶。 她就那樣靜靜地躺著,像睡著了一般淑廊。 火紅的嫁衣襯著肌膚如雪逗余。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天季惩,我揣著相機(jī)與錄音录粱,去河邊找鬼。 笑死画拾,一個胖子當(dāng)著我的面吹牛啥繁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播青抛,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼旗闽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蜜另?” 一聲冷哼從身側(cè)響起适室,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎举瑰,沒想到半個月后捣辆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡此迅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年罪帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮屁。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菠齿,靈堂內(nèi)的尸體忽然破棺而出佑吝,到底是詐尸還是另有隱情,我是刑警寧澤绳匀,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布芋忿,位于F島的核電站炸客,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏戈钢。R本人自食惡果不足惜痹仙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殉了。 院中可真熱鬧开仰,春花似錦、人聲如沸薪铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隔箍。三九已至谓娃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜒滩,已是汗流浹背滨达。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俯艰,地道東北人捡遍。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蟆炊,于是被迫代替她去往敵國和親稽莉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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