亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入JS函數(shù)中默認(rèn)參數(shù)的使用詳解

 更新時(shí)間:2022年07月13日 10:30:35   作者:豬痞惡霸  
本文主要介紹了深入JS函數(shù)中默認(rèn)參數(shù)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

默認(rèn)參數(shù):如果沒(méi)有值或傳入值為undefined的情況下,默認(rèn)函數(shù)參數(shù)允許定義好的形參對(duì)默認(rèn)值進(jìn)行初始化

下面我們來(lái)探討在js中函數(shù)使用默認(rèn)參數(shù)的幾個(gè)細(xì)節(jié),包括默認(rèn)位置,默認(rèn)參數(shù)對(duì)函數(shù)的length屬性的影響,重新創(chuàng)建的默認(rèn)參數(shù),與形參的結(jié)合使用,默認(rèn)參數(shù)的作用域以及默認(rèn)參數(shù)的暫時(shí)性死區(qū)

ES5中的默認(rèn)參數(shù)

在ES5時(shí),還不能直接直接在參數(shù)中指定默認(rèn)值,只能通過(guò)在函數(shù)域內(nèi)聲明變量并賦值,達(dá)到一個(gè)默認(rèn)值的效果,但是這種不會(huì)直觀得表明默認(rèn)值參數(shù)。

function fn(x, y) {
  var y = y || 1;
  return x + y;
}
console.log(fn(2)); // 3

就如上代碼,我們通過(guò)||使y為函數(shù)的默認(rèn)參數(shù),這就是ES5的實(shí)現(xiàn)方式,但是如果我們的參數(shù)是布爾值的情況,就很容易造成問(wèn)題。

下面讓我們看看在ES6針對(duì)這個(gè)問(wèn)題而引入的特性——全新默認(rèn)參數(shù)的誕生

全新默認(rèn)參數(shù)的誕生

ES6函數(shù)參數(shù)默認(rèn)值是可以直接在參數(shù)定義的時(shí)候進(jìn)行默認(rèn)賦值 , 它的應(yīng)用優(yōu)化了代碼結(jié)構(gòu),也增強(qiáng)了代碼閱讀者的體驗(yàn)。

function fn(x, y=1) {
  return x + y;
}
console.log(fn(2)); // 3

值得注意的是參數(shù)定義的時(shí)候賦默認(rèn)值需要注意一些細(xì)節(jié)。

默認(rèn)位置

默認(rèn)參數(shù)值的位置一定為尾參數(shù),即參數(shù)定義的尾部,下面的代碼說(shuō)明了如果默認(rèn)參數(shù)的定義不放在尾部的情況

function fn(x = 1, y) {
  return [x, y];
}
console.log(fn(2)); // [ 2, undefined ]

這種情況即我們無(wú)法再通過(guò)控制x沒(méi)有值使用x的默認(rèn)值,但是可以使用undefined來(lái)解決這個(gè)問(wèn)題

function fn(x = 1, y) {
  return [x, y];
}
console.log(fn(undefined,2)); // [ 1, 2 ]

即使這樣還是建議將默認(rèn)參數(shù)定義在參數(shù)的尾部,其中一個(gè)原因就是它會(huì)影響函數(shù)length屬性

默認(rèn)參數(shù)對(duì)函數(shù)的length屬性的影響

函數(shù)的length屬性會(huì)返回函數(shù)的參數(shù)數(shù)量,其不包括默認(rèn)參數(shù),但是這里有一個(gè)問(wèn)題,它僅僅只會(huì)返回參數(shù)區(qū)域內(nèi)默認(rèn)參數(shù)前的形式參數(shù)數(shù)量

console.log(function fn(x, y = 1, z) {}.length); // 1

上面的函數(shù)x被設(shè)默認(rèn)值,所以其length屬性只返回x之前的形式參數(shù)數(shù)量,由此還是建議將默認(rèn)參數(shù)放在參數(shù)定義的尾部

重新創(chuàng)建的默認(rèn)參數(shù)

函數(shù)在被調(diào)用的時(shí)候,參數(shù)會(huì)被創(chuàng)建,而默認(rèn)參數(shù)有一個(gè)問(wèn)題,就是他是否會(huì)因?yàn)楹瘮?shù)的重復(fù)調(diào)用而被重新創(chuàng)建,在JS中是會(huì)的,來(lái)看下面的例子

function fn(x, num = []) {
  num.push(x);
  return num;
}
console.log(fn(1)); // [1]
console.log(fn(2)); // [2]

通過(guò)上面兩次調(diào)用fn函數(shù)并為num添加元素,而每次調(diào)用得到的結(jié)果證明了每次調(diào)用函數(shù)都會(huì)重新創(chuàng)建默認(rèn)num

默認(rèn)參數(shù)與形參的結(jié)合使用

我們可以將默認(rèn)參數(shù)與形參結(jié)合起來(lái)使用,如下

function fn(x, y, z = [x, y, 1]) {
  return z;
}
console.log(fn(1, 2)); // [ 1, 2, 1 ]

我們通過(guò)尾部的默認(rèn)參數(shù)與前面的形式參數(shù)結(jié)合,可以是字符串形式,也可以是數(shù)組形式,也可以表達(dá)式,比如:fn(x, y, z = x + y)

默認(rèn)參數(shù)的作用域問(wèn)題

深入默認(rèn)參數(shù)的原理,其本質(zhì)為使用let聲明默認(rèn)參數(shù),所以這就造成了一個(gè)現(xiàn)象,即當(dāng)我們使用默認(rèn)參數(shù)的時(shí)候,會(huì)開(kāi)辟一個(gè)單獨(dú)的作用域,在作用域內(nèi)訪(fǎng)問(wèn)一個(gè)變量的時(shí)候會(huì)進(jìn)行一些步驟,為了更好的理解參數(shù)作用域,拿下面拿一段代碼說(shuō)明這個(gè)過(guò)程:

let x = 1
function() fn(y = x) {
    return y
}
console.log(fn()) // 1

由于y = x是默認(rèn)參數(shù),所以參數(shù)定義的區(qū)域形成了一個(gè)單獨(dú)作用域,在賦值的過(guò)程中,它將與引擎進(jìn)行如下對(duì)話(huà),這里忽略掉LHSRHS查詢(xún),不是本文的要點(diǎn)

  • 引擎在為y賦值的時(shí)候會(huì)詢(xún)問(wèn)當(dāng)前作用域是否見(jiàn)過(guò)x,當(dāng)前作用域即參數(shù)聲明的作用域回答沒(méi)有
  • 引擎會(huì)向上走,詢(xún)問(wèn)上級(jí)作用域,此時(shí)為全局作用域,回答有x,引擎為y賦值

通過(guò)這個(gè)簡(jiǎn)單的例子可以理解默認(rèn)參數(shù)的作用域是什么,其實(shí)它很常見(jiàn),比如說(shuō)for循環(huán)

for(let i = 0; i < 100; i++) {}

默認(rèn)參數(shù)的隱藏性死區(qū)(隱藏的暫時(shí)性死區(qū))

在之前let與const命令這篇文章中提到了暫時(shí)性性死區(qū)的概念,而因?yàn)槟J(rèn)參數(shù)的特性,也會(huì)造成暫時(shí)性死區(qū)的現(xiàn)象

暫時(shí)性死區(qū):在代碼塊中使用let聲明變量前,該變量不可用,這種現(xiàn)象稱(chēng)為暫時(shí)性死區(qū)

var x = 1
function fn(x = x) {
    return x;
}

在參數(shù)內(nèi)x = x其本質(zhì)為let x = x= x的時(shí)候會(huì)出現(xiàn)暫時(shí)性死區(qū)的現(xiàn)象,因?yàn)樵诖丝坛霈F(xiàn)問(wèn)題的是=后的x,此時(shí)對(duì)x進(jìn)行訪(fǎng)問(wèn),所以,而此刻在該作用域內(nèi)let x之前,沒(méi)有聲明x,所以該變量不可用,即我們所說(shuō)的暫時(shí)性死區(qū)的現(xiàn)象。

參考文獻(xiàn)

  • ES6標(biāo)準(zhǔn)入門(mén)
  • 你不知道的javascript上卷
  • MDN

到此這篇關(guān)于深入JS函數(shù)中默認(rèn)參數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)JS函數(shù)默認(rèn)參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 頁(yè)面中js執(zhí)行順序

    頁(yè)面中js執(zhí)行順序

    頁(yè)面中js的執(zhí)行順序:在頁(yè)面的head標(biāo)簽中添加一段js代碼,在頁(yè)面的尾部也就是</body>之前添加一段代碼,然后在body的onload事件中引用一個(gè)函數(shù),此三者的執(zhí)行順序如何?
    2009-11-11
  • javascript與CSS復(fù)習(xí)(二)

    javascript與CSS復(fù)習(xí)(二)

    我們接下來(lái)討論元素的可見(jiàn)性,CSS有兩種不同的方式可以有效的隱藏元素,它們有各自的特點(diǎn),會(huì)導(dǎo)致不同的結(jié)果。
    2010-06-06
  • 刪除table表格行的實(shí)例講解

    刪除table表格行的實(shí)例講解

    下面小編就為大家?guī)?lái)一篇?jiǎng)h除table表格行的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • JavaScript構(gòu)造函數(shù)舉例詳解

    JavaScript構(gòu)造函數(shù)舉例詳解

    Javascript構(gòu)造函數(shù)是非常強(qiáng)大的,它可能也是Javascript能被充分利用的特點(diǎn)之一,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),這篇文章主要給大家介紹了關(guān)于JavaScript構(gòu)造函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 微信小程序中使用自定義字體的實(shí)現(xiàn)與體驗(yàn)優(yōu)化

    微信小程序中使用自定義字體的實(shí)現(xiàn)與體驗(yàn)優(yōu)化

    由于微信支持的字體非常有限,不能滿(mǎn)足個(gè)性化的需求,因此在開(kāi)發(fā)的過(guò)程中可能會(huì)需要使用自定義字體,下面這篇文章主要給大家介紹了關(guān)于微信小程序中使用自定義字體的實(shí)現(xiàn)與體驗(yàn)優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 如何基于JS截獲動(dòng)態(tài)代碼

    如何基于JS截獲動(dòng)態(tài)代碼

    這篇文章主要介紹了JS注入eval, Function系統(tǒng)函數(shù)并截獲動(dòng)態(tài)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • JavaScript數(shù)組reduce常見(jiàn)實(shí)例方法

    JavaScript數(shù)組reduce常見(jiàn)實(shí)例方法

    reduce方法在數(shù)組的每個(gè)元素上執(zhí)行用戶(hù)提供的回調(diào)函數(shù),即"reducer",它傳入對(duì)前一個(gè)元素進(jìn)行計(jì)算的返回值,結(jié)果是單個(gè)值,它是在數(shù)組的所有元素上運(yùn)行reducer的結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)組reduce常見(jiàn)實(shí)例方法的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • JS實(shí)現(xiàn)仿PS的調(diào)色板效果完整實(shí)例

    JS實(shí)現(xiàn)仿PS的調(diào)色板效果完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)仿PS的調(diào)色板效果,結(jié)合完整實(shí)例形式分析了javascript通過(guò)運(yùn)算與動(dòng)態(tài)操作頁(yè)面元素實(shí)現(xiàn)調(diào)色板功能的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • js控制input框只讀實(shí)現(xiàn)示例

    js控制input框只讀實(shí)現(xiàn)示例

    控制input框只讀可以防止用戶(hù)對(duì)數(shù)據(jù)的更改,在某些情況下還是比較實(shí)用的,下面使用js來(lái)完成這個(gè)只讀實(shí)現(xiàn)
    2014-01-01
  • Bootstrap布局方式詳解

    Bootstrap布局方式詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap布局方式,分析了Bootstrap網(wǎng)格系統(tǒng)的各種特性,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評(píng)論