1. var 與 let 關鍵詞
(1). var 與 let 兩個關鍵詞的區別
- 使用var關鍵詞聲明的變量既可以是全局變量,也可以是本地變量。是全局變量,還是本地變量主要取決於聲明該變量時是否在函數内。聲明的變量如果在函數内部,則是本地變量;在函數外部,則是全局變量。
- 使用let關鍵詞聲明的變量屬於封鎖範圍blocked-scope内的變量,而不是全局變量。
如:var x = 1;
function example(){
var x = 2;
console.log(x);
}
console.log(x); // 1 (全局變量x的值)
example(); // 2 (本地變量x的值)
- var關鍵詞允許重聲明變量。
- let關鍵詞不允許重聲明變量。
如:var a = 1;
var a;
console.log(a); // 1
let b = 2;
let b;
console.log(b); // TypeError: Duplicate declaration "b"
2. 變量範圍
(1). 全局範圍
- 全局範圍内的變量可以在脚本中的任何地方被訪問。
- 聲明全局變量可以使用var關鍵詞。
如:var a = 1;
function example() {
console.log(a);
}
example(); // 1
- 注意:全局變量泄露現象。
當在聲明變量時,沒有前綴任何關鍵詞,就會出現全局變量現象。因爲,Javascript引擎在搜索相對應的本地變量與全局變量無果后,會自動創建一個對應的全局變量,從而導致全局變量泄露。爲了避免這種現象的發生,可以使用‘use strict’來解決這個問題。
如:‘use strict’
function example() {
a = 1;
return a;
}
console.log(example()); // ReferenceError: a is not defined
(2). 本地範圍
- 在函數中聲明的變量就是本地變量。
- 本地變量只在函數内部才能調用,出了函數則失效。
- 聲明本地變量既可以使用var關鍵詞,也可以使用let關鍵詞。
如:function example(){
let a = 1;
console.log(a);
}
example(); // 1
console.log(a); // ReferenceError: x is not defined (出了函數example範圍則失效)
(3). 區塊範圍
- ES6 提供了let 與 const 兩個關鍵詞來聲明區塊範圍内的變量。
- 一般來説,大括號{}就可以看作是一個區塊。它可以是if、else條件區域,或者for、while循環中的區域。出了區塊範圍,該變量就會失效(有點像本地變量)。
如:for (let a = 0; a < 3; a++){
console.log(a); // 0 // 1 // 2
}
console.log(a); // ReferenceError: a is not defined