日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《02》let 和 const 命令

發布時間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《02》let 和 const 命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1.let命令

基本用法

暫時性死區

不允許重復聲明?

2.塊級作用域

3.const 命令

基本用法

本質


1.let命令

基本用法

ES6 新增了let命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內有效。

<!DOCTYPE?html> <html?lang="en"> <head><meta?charset="UTF-8"><meta?http-equiv="X-UA-Compatible"?content="IE=edge"><meta?name="viewport"?content="width=device-width,?initial-scale=1.0"><title>let基礎用法</title> </head> <body><script>{let?a=1;var?b=2;}console.log("變量a:"+a)//未定義console.log("變量b:"+b)//2</script> </body> </html>

上面代碼在代碼塊之中,分別用let和var聲明了兩個變量。然后在代碼塊之外調用這兩個變量,結果

let聲明的變量報錯,var聲明的變量返回了正確的值。這表明,let聲明的變量只在它所在的代碼塊有效。

for循環的計數器,就很合適使用let命令。

for(let?i=0;?i<10;?i++){ } console.log("變量i"+i)//Uncaught?ReferenceError:?i?is?not?defined

上面代碼中,計數器i只在for循環體內有效,在循環體外引用就會報錯。

下面的代碼如果使用var,最后輸出的是10。

var?a=[]; for(var?i=0;?i<10;?i++){a[i]=function(){console.log(i);} } a[6]();//10

上面代碼中,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。你可能會問,如果每一輪循環的變量i都是重新聲明的,那它怎么知道上一輪循環的值,從而計算出本輪循環的值?這是因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。

暫時性死區

ES6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。

總之,在代碼塊內,使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)。

if (true) {// TDZ開始tmp = 'abc'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ結束console.log(tmp); // undefinedtmp = 123;console.log(tmp); // 123 }

不允許重復聲明?

let不允許在相同作用域內,重復聲明同一個變量。

// 報錯 function func() {let a = 10;var a = 1; }// 報錯 function func() {let a = 10;let a = 1; }

因此,不能在函數內部重新聲明參數。

function func(arg) {let arg; } func() // 報錯function func(arg) {{let arg;} } func() // 不報錯

2.塊級作用域

let實際上為 JavaScript 新增了塊級作用域。

function f1() {let n = 5;if (true) {let n = 10;}console.log(n); // 5 }

上面的函數有兩個代碼塊,都聲明了變量n,運行后輸出 5。這表示外層代碼塊不受內層代碼塊的影響。如果兩次都使用var定義變量n,最后輸出的值才是 10。

ES6 允許塊級作用域的任意嵌套。

3.const 命令

基本用法

const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。

const PI = 3.1415; PI // 3.1415PI = 3; // TypeError: Assignment to constant variable.

上面代碼表明改變常量的值會報錯。

const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。

const foo; // SyntaxError: Missing initializer in const declaration

上面代碼表示,對于const來說,只聲明不賦值,就會報錯。

const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。

if (true) {const MAX = 5; }MAX // Uncaught ReferenceError: MAX is not defined

const命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置后面使用。

本質

const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。對于簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同于常量。但對于復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即總是指向另一個固定的地址),至于它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。

總結

以上是生活随笔為你收集整理的《02》let 和 const 命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。