1、變量
- 定義變量的三種方式:var let const
注意:必須聲明use strict
后才能使用let
聲明變量
2秕岛、三者的區(qū)別
主要區(qū)別在于:作用域(Scope)漱抓,即變量可以使用范圍的定義馏谨,如果超出此范圍就無法使用吹菱,也會(huì)報(bào)錯(cuò)
- 作用域
- 函數(shù):
function test(){ }
- 區(qū)塊:
function test(){ },if{ }吱韭,for(){ }
- var
- 作用域:函數(shù)(function)
- 示例
function test(){
var x = 10;
}
console.log(x); // 錯(cuò)誤信息:ReferenceError: x is not defined
- let
- 作用域:區(qū)塊(block)
- 示例
if (true) {
let x = 10;
}
console.log(x); // 錯(cuò)誤信息:ReferenceError: x is not defined
- const
- 作用域:區(qū)塊(block)
- 示例
const x = 10;
x = 20; // 錯(cuò)誤信息:TypeError: Assignment to constant variable.
-
Note:
-
const
作用域和let
一樣吆豹,只是let
定義變量,const
定義常量 - 重復(fù)聲明理盆、重新賦值一個(gè)常量都會(huì)報(bào)錯(cuò)
-
綜合例子
let x = 1; // 作用域:區(qū)塊外(全域)
if (true) {
let x = 2; // 作用域:區(qū)塊內(nèi)
console.log(x); // 顯示 2
}
console.log(x); // 顯示 1
3痘煤、var的bug
- 舉例:
for (var i = 0; i < 3; i++) {
setTimeout(function () {
console.log(i) }, 1000);
}
//輸出 3 3 3
- 分析:循環(huán)本身及三次
timeout
回調(diào)均共享唯一的變量i
,當(dāng)循環(huán)結(jié)束執(zhí)行時(shí)猿规,i
的值為3衷快,所以當(dāng)?shù)谝粋€(gè)timeout
執(zhí)行時(shí),調(diào)用的i
也為 3姨俩,如果用let
定義循環(huán)蘸拔,多次循環(huán)保持了一個(gè)閉包师郑,那么每個(gè)閉包將捕捉一個(gè)循環(huán)變量的不同值作為副本,而不是所有閉包都捕捉循環(huán)變量的同一個(gè)值调窍。所以示例中呕乎,可以通過將var替換為let修復(fù)bug
4、分別在什么情況下使用
- const 適用于賦值后不會(huì)再做修改的情況
- ** let 適用于賦值后還會(huì)修改的情況陨晶,它標(biāo)志著這個(gè)變量只能被用在所定義的塊作用域**
- var 定義全局變量或函數(shù)級(jí)變量時(shí)可使用,但存在BUG盡量避免使用
5帝璧、總結(jié)
- 通過
var
定義的變量會(huì)提升先誉,而let
和const
進(jìn)行的聲明不會(huì)提升 -
let
聲明的變量作用域是外層塊,而不是整個(gè)外層函數(shù) -
let,const
在未聲明之前是不能使用的的烁,var
可以使用 - 優(yōu)先選擇順序
const>let>var
i;
var i=9;
console.log(i); // 9
i;
let i=9;
console.log(i); // "ReferenceError: i is not defined
因?yàn)樵贘avaScript代碼中用var
變量的定義語句(不包括賦值語句)會(huì)被提前到所有代碼之前執(zhí)行褐耳,所以不會(huì)造成由于變量未定義而出錯(cuò)的結(jié)果
參考文章推薦:
var、let渴庆、const 區(qū)別
JavaScript 變量宣告 var let const
第1章 var let const