第二章 let和const的命令
2.1 let命令
2.1.1 基本用法
let
宣告的變數,只在let
命令所在的程式碼塊內有效
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined
b // 1
for
迴圈的計數器,就很適合使用let
命令
for(let i = 0; i < arr.length;i++){}
i // ReferenceError: a is not defined
2.1.2 不存在變數提升
let
不像 var
那樣會發生 “變數提升” 現象,所以變數一定要在宣告後使用,否則報錯。
console.log(foo); ==> undefined
console.log(bar); ==> ReferenceError: bar is not defined
var foo = 2;
let bar = 2
2.1.3 暫時性死區
只要塊級作用域記憶體在let命令,它所宣告的變數就“繫結”這個區域,不再受外部的影響。
var tmp = 123;
if( true ){
tmp = 'abc'; // ReferenceError: tmp is not defined
let tmp;
}
ES6明確規定,如果區塊中存在let
和const
命令。這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。
“暫時性死區”也意味著 typeof
不再是一個百分之百安全的操作
typeof x // ReferenceError: x is not defined
let x
這樣的設計是為了讓大家養成良好的程式設計習慣,變數一定要在宣告後使用,否則就會報錯。
ES6規定暫時性死區和let
,const
語句不出現變數提升,主要是為了減少執行時的錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。
2.1.4 不允許重複宣告
let
不允許在相同作用域內,重複宣告同一個變數
//報錯
function func(){
let a = 10;
var a = 1;
}
//報錯
function func(){
let a = 10;
lat a = 1;
}
//報錯
function func(arg){
let arg;
}
2.2 塊級作用域
2.2.1 為什麼需要塊級作用域?
(1) 內層變數可能會覆蓋外層變數
var tmp = new Date();
function f(){
console.log(tmp)
if( false ){
var tmp = 'hello world'
}
}
f() ==> undefined
tmp
變數提升覆蓋了tmp
原始值
(2) for迴圈中的迴圈變數洩露為全域性變數
2.2.2 ES6的塊級作用域
ES6中的let
、const
實現了塊級作用域
塊級作用域的出現,使得廣泛應用的立即執行匿名函式(IIFE)不再必要了
// IIFE 寫法
(function(){
var tmp = '';
}());
//塊級作用域寫法
{
let tpm = '';
}
2.2.3 塊級作用域與函式宣告
ES5規定,函式只能在頂層作用域和函式作用域之中宣告,不能在塊級作用域宣告,所以,以下兩種都是錯誤的:
//情況1:
if( true ){
function f(){}
}
//情況2
try{
function f(){}
} catch (e) {
}
但是,瀏覽器沒有遵守這個規定,不會報錯。不過,在嚴格模式下,會報錯。
ES6 引入了塊級作用域,明確允許在塊級作用域之中宣告函式。
應該避免在塊級作用域內宣告函式,如果確實需要,也應該寫成函式表示式,而不是函式宣告語句。
//函式宣告語句
{
let a = 'secret';
function f(){
return a;
}
}
//函式表示式
{
let a = 'secret';
let f = function (){
return a;
}
}
2.3 const命令
const
宣告一個只讀的常量,一旦宣告,常量的值就不能改變,
const PI = 3.1415;
PI = 3 // 報錯
const
一旦宣告變數,必須立即初始化,不能留到以後賦值const foo
//報錯 Missing initializer in const declaration
const
的作用域與let
命令相同,只在宣告所在的塊級作用域內有效。
if ( true ){
const MAX = 5;
}
MAX //報錯
const
也沒有變數提升,存在暫時性死區,只能在宣告的位置後面使用。
if( true ){
console.log(MAX); // ReferenceError: MAX is not defined
const MAX = 5;
}
const
不可重複宣告
var message = 'hello';
const message = 'goobye' //報錯 Missing initializer in const declaration
2.4 全域性物件的屬性
未宣告的全域性變數,自動成為全域性物件的window
屬性,這被認為是js語言最大的設計敗筆之一。
ES6為了改變這一點,
一方面規定:為了保持相容性,var
命令和 function
命令宣告的全域性變數,依舊是全域性物件的屬性。
var a = 1;
window.a ==> 1
function f(){ console.log('a') }
widnow.f() ==> 'a'
另一方面規定:let
命令、const
命令、class
命令宣告的全域性變數,不屬於全域性物件的屬性。
也就是說,從ES6開始,全域性變數將逐步與全域性物件的屬性脫鉤
let b = 1;
window.b ==> undefined
相關文章
- ES6 let和const命令
- let與const命令
- ES6入門——let和const命令
- 阮一峰的ES6---let和const命令
- ES6let命令和塊級作用域和const命令
- var、let和const的區別
- var和let/const的區別
- var、let和const的知識點
- var,let和const深入解析(一)
- JS中const、var 和let的區別JS
- ES6語法——let和const
- ES6中let 和 const 的新特性
- var、const、let 的區別
- ES6中let和var和const的區別
- es6學習之let和const
- 前端學習筆記 - var、let和const的用法前端筆記
- let const var 區別
- var let const區別
- let與const區別
- let,const,var區別
- ES6系列——let和const深入理解
- 前端 let、const和var你真的瞭解麼?前端
- JavaScript 中的 Var,Let 和 Const 有什麼區別JavaScript
- 每日一記 3分鐘從編譯後的程式碼裡學 let 和 const 命令編譯
- JavaScript中let、const、var 的區別JavaScript
- ES6學習筆記一(let和const)筆記
- ES6學習筆記(一)————————————–let和const筆記
- var、let和const三者有哪些區別?
- 變數和函式宣告提升,let和var const區別變數函式
- var、let、const宣告變數的區別變數
- JavaScript中的var、let 及 const 區別JavaScript
- 1.變數:var,let,const變數
- 1分鐘帶你瞭解var let 和 const 的區別
- 現代JavaScript — ES6+中的Imports,Exports,Let,Const和PromiseJavaScriptImportExportPromise
- 現代JavaScript:ES6+ 中的 Imports,Exports,Let,Const 和 PromiseJavaScriptImportExportPromise
- ES5 和 ES6:let const var 區別
- 每天學習一點ES6(二)let 和 const
- ES6 let和const詳解及使用細節