來總結下JS中是哪個變數的區別與各自的特性
部分案例與思路來自位元組跳動月影大佬的課程 、廖大的教程 變數作用域與解構賦值
一些思路來自 理解ES6中的暫時死區(TDZ)
文章目錄
- 變數宣告概述
- 變數提升
- var
- let
- const
變數宣告概述

-
1.盡量采用let const的宣告方式哦
-
2.const的系結值不可變!因為定義就是 constant variable嘛~
-
3.var使用函式作用域 let/const使用區塊作用域
-
4.1 TDZ 暫存死區 -“Temporal Dead Zone”
-
4.2 hoist 宣告提升
-
所以在let/const宣告之前就訪問對應的變數與常量,會拋出
ReferenceError錯誤(由于TDZ的作用 變數提升不起作用);但在var宣告之前就訪問對應的變數,則會得到undefined
我們要記住 let/const宣告的變數,的確也是有提升(hoist)的作用!因為提升是JS語言中對于變數宣告的基本特性,
只是因為有TDZ的作用 如果我們在宣告變數之前就使用了這個變數 會直接拋出ReferenceError錯誤
防止在變數宣告前就使用這個變數可以避免很多錯誤哦!
變數提升
我們需要先了解下JS語言中變數的 Hoist(提升)特性(所有變數都有的嗷)
JavaScript的函式定義有個特點,它會先掃描整個函式體的陳述句,把所有申明的變數“提升”到函式頂部:
function foo() {
var x = 'Hello, ' + y;
console.log(x);
var y = 'Bob';
}
foo();

這里是參考了廖大的教程哈
JavaScript引擎自動提升了變數y的宣告 但是!不會提升變數y的賦值 所以 y 的值是 undefined
對于上述foo()函式,JavaScript引擎看到的代碼相當于:
function foo() {
var y; // 提升變數y的宣告,此時y為undefined
var x = 'Hello, ' + y;
console.log(x);
y = 'Bob';
}
由于JavaScript的這一怪異的“特性”,我們在函式內部定義變數時,請嚴格遵守“在函式內部首先申明所有變數”這一規則,最常見的做法是用一個var申明函式內部用到的所有變數:
function foo() {
var
x = 1, // x初始化為1
y = x + 1, // y初始化為2
z, i; // z和i為undefined
// 其他陳述句:
for (i=0; i<100; i++) {
...
}
}
這個習慣在C語言編程時就很熟悉啦~
看完變數提升的概念 我們為每一種變數舉一個例子
來了解下它們的特性
var

-
紅色箭頭體現了變數提升在var變數中的應用 但是這種特性容易導致一些錯誤出現 因為我們可能不小心在變數宣告之前就用了這個變數而且還不報錯!
-
藍色剪頭體現了var變數的函式作用域
let

-
紅色箭頭體現了暫存死區TDZ導致let變數無法被提升
-
藍色箭頭體現了let變數的區域作用域
const

-
紫色箭頭體現了const物件的特性——沒有動態系結 系結值不可變!
-
其他特性是和let一樣的嗷~ 有暫存死區、有塊級作用域
-
我們如果要宣告一個不可變的數 使用const來宣告體現了我們良好的編碼習慣~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/290892.html
標籤:其他
上一篇:jQuery屬性的操作
