ES6學習筆記1 let命令

2021-09-19 16:21:12 字數 2580 閱讀 8504

1、新增let命令

a // referenceerror: a is not defined.

b // 1

有一種情況很適合用let命令:for迴圈的計數器。

for(let i =0; i下面就用乙個例子來比較一下let和var在for迴圈計數器的不同,為什麼let更適合:

var a = ;

for(var i = 0; i < 8; i++)

}a[5](); // 8

var a = ;

for(let i = 0; i < 8; i++)

}a[5](); // 5

2、只要塊級作用域內存在let命令,那麼它所宣告的變數就不再受外部的影響,形成了封閉作用域

if (true)
在let命令宣告變數tmp之前,都屬於變數tmp的"死區"。

let foo = 'outer';

function bar(func = x => foo)

bar();

func 預設是乙個匿名函式,返回值為foo,作為bar函式的引數。func的作用域不是bar,func宣告是在外層作用域,所以bar內部的foo指向函式體外的foo的值,這段**等同於下面這段**:

let foo = 'outer'

let f = x => foo;

function bar(func = f)

bar();

總之,暫時性死去的本質就是:只要已進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。

3、新增塊級作用域

es5只有全域性作用域和函式作用域,這樣會產生很多不合理的場景。

第一種場景:內層變數可能會覆蓋外層變數

var tmp = "hello";

(function())(); //undefined

思考一下,為什麼結果會是undefined呢?

var tmp = "hello";

if(true) // hello

var tmp = "hello";

(function())(); //undefined

第二種場景,用來計數的迴圈變數洩露為全域性變數。

var s = 'hello';

for (var i = 0; i < s.length; i++)

console.log(i); // 5

變數i只是用來控制迴圈的,迴圈結束它就沒有用了,但是卻洩露成了全域性變數,這個很不好。

可以說let為js增加了塊級作用域,來看下面這段**吧:

function a()

console.log(s); //1

}

function a()

console.log(s); //3

}

let 宣告的變數,使外層的**不受內層的**影響,而var則沒有這樣的效果。

es6允許塊級作用域的任意巢狀,並且外層作用域無法讀取內層作用域的變數

console.log(s); // 報錯

}}}};

內層作用域可以定義外層作用域的同名變數

}}}};

塊級作用域可以代替立即執行函式

//立即執行函式

(function()());

//塊級作用域

es6中函式本身的作用域在其所在的塊級作用域之內

function f() 

(function ()

} f();

}());

es5中的執行結果:i am inside!

es6中的執行結果:i am outside!

造成這樣結果的原因就是:

}f(); //報錯

因為函式的呼叫在塊級作用域的外部,所以無法呼叫塊級作用域內部定義的函式。

let b;

}b() // "world"

如果**進行上面這樣的處理,即把函式b的宣告與函式呼叫放在同一塊級作用域就可以了。

注:如果在嚴格模式下,函式只能在頂層作用域和函式內宣告,其他情況(比如if**塊、迴圈**塊)的宣告都會報錯。

ES6學習筆記1 let 和 const

let命令與var用法類似,用於宣告變數,區別在於其宣告的變數只在let命令所在的 塊中有效 for let i 0 i 10 i console.log i 變數i未定義在for迴圈中,設定迴圈變數的那部分是乙個父作用域,而迴圈體內部是乙個單獨的子作用域,上述i在迴圈的作用域中定義,因此在迴圈體外...

ES6學習 let和const命令

1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...

ES6學習 let和const命令

說明 本文參考阮一峰的ecmascript 6 入門 console.log a 塊外使用會報錯 referenceerror a is not defined for迴圈內使用let和var產生的不同效果 下面 使用的是var,結果為10 var a for var i 0 i 10 i a 9 ...