在JS當中一個變量的做用域(scope)是程序中定義這個變量的區域。變量分爲兩類,全局(global)的和局部的。其中全局變量的做用域是全局性的,即在JavaScript代碼中,它到處都有定義。而在函數以內聲明的變量,就只在函數體內部有定義。它們是局部變量,做用域是局部性的。函數的參數也是局部變量,它們只在函數體內部有定義。javascript
在javascript中var關鍵字聲明變量具備兩個特色,第一變量提高(對變量的定義會默認提早至函數開始處),第二變量沒有塊做用域只有函數做用域。java
(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.code
在ES6的標準中,新引入了let關鍵字用於聲明變量,let關鍵字與var關鍵字不一樣在於let爲塊做用域。 將1.1.2中代碼定義變爲let後,程序則不能執行。ip
(function scope() { if(true){ let i =10; } console.log(i); })(); ===== i is not defined
const用來聲明常量,一旦聲明,其值就不能改變,而且const定義的變量爲塊做用域,好比1.3.1和1.3.2這樣編寫代碼是會出錯的。作用域
(function scope() { if(true){ const pi =3.14; } console.log(pi); })(); ===== pi is not defined
(function scope() { const pi = 3.14; pi=3; console.log(pi); })();