總體來說,var
和let
的區別就是作用域的不同。
const
和let
是相同作用域,區別就是不可被重新賦值。
var a =10;
console.
log(window.a)
;// 10
let b =10;
console.
log(window.b)
;// undefined
const c =10;
console.
log(window.c)
;// undefined
作用域就是可以 訪問到這個變數的範圍。
如果var
定義在function外面,則作用域是全域性的,如果定義在function裡面,var
的作用域是function。
而let
和const
定義的變數的作用域都是包裹著它的大括號裡的**塊。並且,let
和const
定義的變數不會被hoisting
function
funcvar()
console.
log(tmp)
;// 123
}function
funcconst()
// <--這裡結束
console.
log(tmp)
;// referenceerror: tmp is not defined
}
let x =10;
if(x ==10)
// <-- 出了這個塊,裡面的x就沒了
console.
log(x)
;// 10 -- 外面的x
let x =10;
if(x ==10)
// <--這裡面並沒有定義x,所以改變的是外層的x,
console.
log(x)
;// 20
在js中,可以在變數定義之前使用變數,因為變數的定義會被提到作用域最頂上(看上去的定義的位置其實只是賦值)。這個過程叫做hoisting。
而用let和const定義的變數並不會被hoisting。
function
testvar()
function
testlet()
下面的**中,var
的作用域是全域性的(for是個**塊並不是個函式),所以整個過程中只有乙個i
,所以在三次迴圈中,繫結的是統一個i
,這樣最後i
變成3了之後,arr1
裡面三個函式都返回了3.
const arr1 =
;for
(var i=
0; i <
3; i++
)arr1.
map(x =>x(
));// [3,3,3]
console.
log(i)
;// 3
下面**中,let
的作用域是for迴圈這個**塊,所以arr2
中的三個函式繫結的j
是不同的。 而從for迴圈之外是沒有辦法直接訪問j
的。
const arr2 =
;for
(let j=
0; j <
3; j++
)arr2.
map(x =>x(
));// [0,1,2]
console.
log(j)
;// referenceerror: j is not defined
// typeerror: assignment to constant variable
for(
const i=
0; i<
3; i++
)//但是可以這樣用:
for(
const i of[0
,1,2
])
var和let const的區別
let和const是 es6 新增的命令,用於宣告變數,這兩個命令跟 es5 的var有許多不同,並且let和const也有一些細微的不同,再認真閱讀了阮一峰老師的文件後,發現還是有一些不知道的細節 var和let const的區別 塊級作用域 不存在變數提公升 暫時性死區 不可重複宣告 let c...
var和let const的區別
let和const是 es6 新增的命令,用於宣告變數,這兩個命令跟 es5 的var有許多不同,並且let和const也有一些細微的不同,再認真閱讀了阮一峰老師的文件後,發現還是有一些不知道的細節.部落格 前端積累文件 github var和let const的區別塊級作用域 不存在變數提公升 暫...
let const和var的區別
1.1 var沒有塊作用域,很容易汙染全域性 函式中的變數汙染了全域性環境 function run run console.log web houlaizhe 沒有塊作用作用域時var也會汙染全域性 for var i 0 i 10 i console.log i 1.2 塊作用域 沒有塊作用時使...