91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中var與let的區別是什么

發布時間:2021-12-08 13:32:52 來源:億速云 閱讀:127 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關JavaScript中var與let的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

前言:

varJavaScript剛出現時就存在的變量聲明關鍵字,而let作為ES6才出現的變量聲明關鍵字,無疑兩者之間存在著很大的區別。那么具體有哪些區別呢?

1.作用域表現形式不同

var是函數作用域,let是塊級作用域

{
  var monkey='熏悟空';
  let pig='豬扒蓋';    
}
console.log(monkey); //輸出undefined
console.log(pig); //報錯:pig is not deined

由上面代碼可見,let聲明的變量只在其所在的代碼塊有效,在代碼塊外部無效無法訪問,而var聲明的變量在該代碼塊所在的函數作用域內都有效。

2.是否變量提升的區別

var聲明的變量會進行變量提升,let聲明的變量不會進行變量提升。

console.log(monkey); //undefined
var monkey='熏悟空';

console.log(pig); //報錯:pig is not defined
let pig='豬扒蓋';

同樣的邏輯,為什么var聲明的變量在它聲明之前調用會顯示未定義,而let聲明的變量在聲明之前調用會拋出異常呢,這就是兩者在變量提升上的區別,var聲明的變量存在變量提升,let聲明的變量不存在變量提升。

那么什么叫變量提升呢,我這里不做概念性的描述,我只說我個人的理解,就是以上代碼實際上相當于如下:

var monkey;

console.log(monkey); //undefined
monkey='熏悟空';

console.log(pig); //報錯:pig is not defined
let pig='豬扒蓋';

看見區別了嗎,var聲明的變量會將聲明的變量提取到作用域的最上面進行定義但不賦值,賦值操作還是在你的代碼處,所以你在調用var聲明的變量時就是一個已經聲明但是并未定義值的變量,所以調用結果就是undefined,這就是所謂的變量提升。而let定義的變量不存在這種變量提升。

3.暫時性死區上的區別

暫時性死區:如果在某一作用域內let了一個變量,如果外部作用域中有相同名稱的變量,那么就算在作用域內進行了更改,也不會影響到外部作用域

具體表現如下:

for(var i=0;i<5;i++){
    setTimeout(function(){
        console.log(i)
    },1000)
}
for(let i=0;i<5;i++){
  setTimeout(function(){
     console.log(i)          
  },1000)  
}

請問這兩處代碼的運行結果分別是什么?

第一處代碼運行完畢的結果是1s后順序打印5個5;第二處代碼運行完畢的結果是1s后順序打印0,1,2,3,4。

請問為什么會存在這種區別?

因為第一處代碼的變量i由var關鍵字聲明,不存在關鍵性死區,即你在1s后setTimeout中訪問到的變量i是全局上下文中for循環運行完畢之后的i,所以打印的結果全是5;

而第二處代碼的變量i由let關鍵字聲明,產生了關鍵性死區,存在setTimeout中的i變量是你當時存儲時的i的值,這個存儲區間的i不會因為外面有相同的i變量且賦了不同的值而改變,他依舊是之前存儲進去的值,這就是暫時性死區的表現,也是為什么第二處代碼運行完畢是順序打印0,1,2,3,4的原因。

4.在同一個上下文中var可以重復聲明,let不行

let monkey='熏悟空';
let monkey='逼馬吻'; //報錯:Identifier 'a' has already been declared
var pig='豬扒蓋';
var pig='豬肛裂';  //正常訪問,變量pig的值被替換

以上就是JavaScript中var與let的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜兰市| 夏河县| 寿阳县| 宽甸| 卢龙县| 合川市| 鹤庆县| 榆林市| 张北县| 垣曲县| 周至县| 普兰县| 宽城| 名山县| 页游| 泸定县| 高安市| 宜春市| 石景山区| 德惠市| 连平县| 中卫市| 南陵县| 陕西省| 易门县| 水富县| 桃源县| 康马县| 信宜市| 观塘区| 新龙县| 郁南县| 五寨县| 武强县| 万盛区| 盱眙县| 富民县| 西乌珠穆沁旗| 图木舒克市| 九龙坡区| 灯塔市|