最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript暫時性死區(qū)以及函數(shù)作用域

 更新時間:2023年07月19日 10:29:48   作者:DCodes  
這篇文章主要為大家介紹了JavaScript暫時性死區(qū)以及函數(shù)作用域示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

暫時性死區(qū)

暫時性死區(qū)也就是變量聲明到聲明完成的區(qū)塊,這個區(qū)塊是一個封閉的作用域,直到聲明完成。
如果在變量聲明之前使用該變量,那么該變量是不可用的,也就被稱為暫時性死區(qū)。

  • var 沒有暫時性死區(qū),因為var存在變量提升
  • let、const有塊級作用域,沒有變量提升,存在暫時性死區(qū)
console.log(a); // 報錯 Cannot access 'a' before initialization
let a = '東方不敗'
console.log(b); // 報錯 Cannot access 'b' before initialization
const b = '東方不敗'
console.log(c);   // undefined 因為var存在變量提升
var c = '東方求敗'

ES6規(guī)定,如果代碼塊中存在letconst命令聲明的變量,這個區(qū)塊對這些變量從一開始就形成了封閉作用域,直到聲明語句完成,這些變量才能被訪問(獲取或設置),否則會報錯ReferenceError。這在語法上稱為“暫時性死區(qū)”(英temporal dead zone,簡 TDZ),既代碼塊開始到變量生命語句完成之前的區(qū)域。

函數(shù)作用域

案例一

一旦設置了參數(shù)的默認值,函數(shù)進行生命初始化時,參數(shù)就會形成一個單獨的作用域,等初始化結束,這個作用域就會消失,這種語法在不設置參數(shù)默認值時不會出現(xiàn)。

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

上面這個例子中,函數(shù)參數(shù)這里(x,y = x),這個區(qū)域就是單獨的作用域,y默認的x變量指向第一個參數(shù)x,而不是全局變量x,這里調用f函數(shù),向x傳遞數(shù)值2,y = x 那么 y = 2,打印結果為2

案例二

let x2 = 1
function f2(y2 = x2){
         let x2 = 2
         console.log(y2);
     }
f2()  // 1

調用f2函數(shù),由于未給f2函數(shù)任何參數(shù),并且 y2 = x2 形成一個單獨的作用域,在這個作用域里x2并未定義,所以x2指向的是外層全局變量x2,y2 = x2 也就是y2 = 1,在這里,函數(shù)內部的x2并未起到任何作用。

函數(shù)執(zhí)行的時候會先執(zhí)行參數(shù),再執(zhí)行函數(shù)體。

// 報錯
function f2(y2 = x2){
         let x2 = 2
         console.log(y2);
     }
f2()  // 報錯

上面的例子中,如果去掉全局變量x2則會報錯,因為變量未聲明,給y2賦值了一個未聲明的變量,報錯。

var xx = 1
function fxx(xx = xx){
    console.log(xx);
    }
fxx()

上面這個寫法也會報錯,由于函數(shù)的參數(shù)存在單獨的作用域,在這個參數(shù)作用域內,執(zhí)行結果為 let xx = xx,給xx賦值一個未聲明的變量xx報錯。(暫時性死區(qū))

如果函數(shù)的默認參數(shù)是函數(shù),該函數(shù)的作用域也要遵循這個規(guī)則。

let foo = 'out'
function bar(func = () => foo){
      let foo = 'come'
      console.log(func());
  }
bar()  // out

這個例子中,函數(shù)的參數(shù)是func默認值是一個匿名函數(shù),返回值為變量foo,由于函數(shù)參數(shù)這里形成一個單獨的作用域,在這個作用域里面并沒有定義變量foo,所以foo會指向外層全局變量foo。如果去掉全局變量foo='out'報錯,賦值了一個未聲明的變量。

應用可以利用這個特性寫一個參數(shù)默認值錯誤拋出,如果參數(shù)并未傳參則拋出一個錯誤。

function throwErr(){
    throw new Error('參數(shù)不得省略')
    }
    
function omits(mustfn = throwErr()){
    return mustfn
    }
omits(); // 未傳參拋出錯誤 : 參數(shù)不得省略

調用omits函數(shù)未傳參數(shù),該函數(shù)就會默認調用throwErr()函數(shù)并拋出錯誤。

如果將參數(shù)默認值設置為 undefined 則表示該參數(shù)是可以省略的。

rest參數(shù)

arguments

arguments可以獲得函數(shù)的參數(shù)值以及函數(shù)信息(name、length)等

function au(arr){
        console.log('arguments:',arguments);
    }
    au(2,1,4,3)

可以通過數(shù)組方法對函數(shù)參數(shù)進行操作,例如排序。

arguments對象不是數(shù)組,而是一個類似數(shù)組的對象,為了使用數(shù)組的方法,必須使用Array.from先將其轉為數(shù)組。

function au(arr){
     // 通過數(shù)組方法對函數(shù)參數(shù)進行排序
     return Array.from(arguments).sort();
   }
console.log(au(2,1,4,3))  // [1,2,3,4]

rest參數(shù)ES6提供了rest參數(shù),語法:(...變量名),其實就是剩余運算符,通過rest參數(shù)就可以很容易的對函數(shù)參數(shù)進行操作,并且

rest的參數(shù)是一個真正的數(shù)組。

// resy參數(shù)(剩余運算符)
function residue(...val){
      console.log(val);  // [1,2,3]
    }
residue(1,2,3)

rest參數(shù)(剩余運算符)只能放到最后一位,否則報錯

// function residue2(...val,b){}  // 剩余運算符不是最后一位,報錯
function residue3(c,...val){
  console.log(c,val);  // 1 [2,3,4,5] 
 }
residue3(1,2,3,4,5)

上面arguments完成的參數(shù)排序,使用rest可以很輕松的做到,并且語義更強,更方便閱讀。

let au2 = (...val) => val.sort()
console.log(au2(2,1,4,3));  // [1, 2, 3, 4]

嚴格模式

ES5開始,函數(shù)內部可以設定為嚴格模式: function s(){ 'use strict'// 嚴格模式 }

// es5嚴格模式
function s(){
   'use strict'   // 嚴格模式
   // 代碼.....
}

ES6做了修改,規(guī)定只要函數(shù)參數(shù)使用了默認值、解構賦值、擴展運算符,那么函數(shù)內部就不能顯示設定為嚴格模式,否則報錯。

// es6嚴格模式  報錯,因為設置了函數(shù)默認值
function s2(a,b = a){
   'use strict'
   // 代碼.....
}
// 報錯,使用了解構賦值
const s3 = function({a,b}){
    'use strict'
}
// 報錯,使用了剩余運算符
const s4 = (...a) => {
    'use strict'
}

es6這樣設置的原因是,函數(shù)內部的嚴格模式應該同樣適用于函數(shù)體和函數(shù)參數(shù),但是,函數(shù)執(zhí)行的時候會先執(zhí)行參數(shù),再執(zhí)行函數(shù)體,這樣就有一些不嚴謹?shù)那闆r,只有函數(shù)體中才能知道參數(shù)是否應該以嚴格模式執(zhí)行,但是函數(shù)的參數(shù)確是先執(zhí)行,所以es6修改了函數(shù)參數(shù)關于嚴格模式的行為。

function s5(val = 070){
    'use strict'
    return val
}
s5()  // 報錯

這一段,函數(shù)的默認值是八進制070,嚴格模式下不能使用前綴0表示八進制,所以報錯。
但實際上是因為函數(shù)設置了默認參數(shù)的原因,函數(shù)先執(zhí)行參數(shù),再進函數(shù)體,由于es6限制,報錯。

有兩種方法可以規(guī)避這種限制

第一種:設置全局嚴格模式

'use strict'
function s6(val = 100){
  console.log(val);
}
s6()  // 100

第二種方法:把函數(shù)嵌套在一個無參數(shù)的立即執(zhí)行函數(shù)里

const s7 = () => {
     'use strict'
     let a;
     return (function(val = 200){ return val })()
}
console.log(s7());

匿名函數(shù)的調用方法:在上述例子(function(val = 200){return val})()中,將整個return的函數(shù)用()套起來,尾部加一個()調用即可,()在函數(shù)中代表調用。

案例源碼:https://gitee.com/wang_fan_w/es6-science-institute

以上就是JavaScript暫時性死區(qū)以及函數(shù)作用域的詳細內容,更多關于JS暫時性死區(qū)函數(shù)作用域的資料請關注腳本之家其它相關文章!

相關文章

  • JS自動生成動態(tài)HTML驗證碼頁面

    JS自動生成動態(tài)HTML驗證碼頁面

    這篇文章主要介紹了JS自動生成動態(tài)HTML驗證碼頁面,輸入錯誤自動清空輸入框的功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 如何讓每個Http請求都自動帶上token

    如何讓每個Http請求都自動帶上token

    這篇文章主要介紹了如何讓每個Http請求都自動帶上token問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JS實現(xiàn)移動端判斷上拉和下滑功能

    JS實現(xiàn)移動端判斷上拉和下滑功能

    通過手指觸屏,利用touchstart和touchend計算前后滑動距離,判斷是上拉還是下滑。接下來通過實例代碼給大家介紹js移動端判斷上拉和下滑功能,感興趣的朋友一起看看吧
    2017-08-08
  • 自己的js工具 Cookie 封裝

    自己的js工具 Cookie 封裝

    有些時候我們的web程序需要利用cookie來實現(xiàn)一些功能,很多時候我們并不需要非得用服務端來操作cookie,因為js可以也操作cookie.
    2009-08-08
  • javascript實現(xiàn)的網站訪問量統(tǒng)計代碼

    javascript實現(xiàn)的網站訪問量統(tǒng)計代碼

    本文文章通過兩段代碼實例給大家介紹了基于javascript實現(xiàn)網站訪問量統(tǒng)計代碼,對js實現(xiàn)網站訪問量統(tǒng)計相關知識感興趣的朋友一起學習吧
    2015-12-12
  • 小程序實現(xiàn)自定義導航欄適配完美版

    小程序實現(xiàn)自定義導航欄適配完美版

    這篇文章主要介紹了小程序實現(xiàn)自定義導航欄適配完美版,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • bootstrap下拉菜單使用方法解析

    bootstrap下拉菜單使用方法解析

    這篇文章主要為大家詳細解析了bootstrap下拉菜單使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Axios設置token請求頭的三種方式

    Axios設置token請求頭的三種方式

    用戶登錄時,后端會返回一個token,并且保存到瀏覽器的localstorage中,可以根據(jù)localstorage中的token判斷用戶是否登錄,所以當發(fā)送請求時,都要攜帶token給后端進行判斷,本文給大家介紹了Axios設置token請求頭的三種方式,需要的朋友可以參考下
    2024-02-02
  • 詳解JavaScript中new操作符的解析和實現(xiàn)

    詳解JavaScript中new操作符的解析和實現(xiàn)

    這篇文章主要介紹了JavaScript中new操作符的解析和實現(xiàn),幫助大家更好的理解和學習JavaScript,感興趣的朋友可以了解下
    2020-09-09
  • 自定義百度分享的分享按鈕

    自定義百度分享的分享按鈕

    這篇文章主要介紹了自定義百度分享的分享按鈕的相關資料,需要的朋友可以參考下
    2015-03-03

最新評論

高安市| 沈阳市| 海晏县| 九龙坡区| 镇坪县| 抚顺市| 班玛县| 鹤山市| 随州市| 平武县| 兖州市| 云浮市| 三亚市| 衡阳市| 东方市| 根河市| 合山市| 河南省| 遂昌县| 页游| 万州区| 九龙县| 普兰店市| 浮山县| 临海市| 怀来县| 城固县| 光泽县| 汕尾市| 北海市| 洛浦县| 永春县| 金昌市| 吉木乃县| 佛山市| 江源县| 桐城市| 西华县| 吐鲁番市| 永丰县| 云霄县|