1、聲明變量
在JS當中一個變量的作用域(scope)是程序中定義這個變量的區域。變量分為兩類,全局(global)的和局部的。其中全局變量的作用域是全局性的,即在JavaScript代碼中,它處處都有定義。而在函數之內聲明的變量,就只在函數體內部有定義。它們是局部變量,作用域是局部性的。函數的參數也是局部變量,它們只在函數體內部有定義。
1.1 var變量聲明方式
在javascript中var關鍵字聲明變量具有兩個特點,第一變量提升(對變量的定義會默認提前至函數開始處),第二變量沒有塊作用域只有函數作用域。
(function scope() {
var i = 10;
(function innerscope() {
console.log(i);
var i = 10;
})();
})();
=====
undefined
代碼1.1.1中,第二個變量i的定義提前至函數innerscope開始位置,因此在console.log(i)的時候i並沒有賦值,因此輸出結果為undefined。
(function scope() {
if(true){
var i =10;
}
console.log(i);
})();
=====
10
代碼1.1.2中,在if塊中定義的變量i在if塊外函數內依然可以使用,因此輸出結果10.
1.2 let聲明變量方式
在ES6的標准中,新引入了let關鍵字用於聲明變量,let關鍵字與var關鍵字不同在於let為塊作用域。 將1.1.2中代碼定義變為let后,程序則不能執行。
代碼 1.1.2
(function scope() {
if(true){
let i =10;
}
console.log(i);
})();
=====
i is not defined
1.3 const聲明變量方式
const用來聲明常量,一旦聲明,其值就不能改變,並且const定義的變量為塊作用域,比如1.3.1和1.3.2這樣編寫代碼是會出錯的。
代碼1.3.1
(function scope() {
if(true){
const pi =3.14;
}
console.log(pi);
})();
=====
pi is not defined
代碼1.3.2
(function scope() {
const pi = 3.14;
pi=3;
console.log(pi);
})();