CMAScript 2015(ECMAScript 6)
ES2015(ES6) 新增加了兩個重要的 JavaScript 關鍵字: let 和 const。
let 聲明的變量只在 let 命令所在的代碼塊內有效。
const 聲明一個只讀的常量,一旦聲明,常量的值就不能改變。
在 ES6 之前,JavaScript 只有兩種作用域: 全局變量 與 函數內的局部變量。
全局變量
在函數外聲明的變量作用域是全局的:
實例
var carName="Volvo";
// 這里可以使用 carName 變量
function myFunction() {
// 這里也可以使用 carName 變量
}
全局變量在 JavaScript 程序的任何地方都可以訪問。
局部變量
在函數內聲明的變量作用域是局部的(函數內):
實例
// 這里不能使用 carName 變量
function myFunction() {
var carName="Volvo";
// 這里可以使用 carName 變量
}
// 這里不能使用 carName 變量
函數內使用 var 聲明的變量只能在函數內容訪問,如果不使用 var 則是全局變量。
JavaScript 塊級作用域(Block Scope)
使用 var 關鍵字聲明的變量不具備塊級作用域的特性,它在 {} 外依然能被訪問到。
{
var x=2;
}
// 這里可以使用 x 變量
在 ES6 之前,是沒有塊級作用域的概念的。
ES6 可以使用 let 關鍵字來實現塊級作用域。
let 聲明的變量只在 let 命令所在的代碼塊 {} 內有效,在 {} 之外不能訪問。
{
let x=2;
}
// 這里不能使用 x 變量
重新定義變量
使用 var 關鍵字重新聲明變量可能會帶來問題。
在塊中重新聲明變量也會重新聲明塊外的變量:
實例
var x=10;
// 這里輸出 x 為 10
{
var x=2;
// 這里輸出 x 為 2
}
// 這里輸出 x 為 2
let 關鍵字就可以解決這個問題,因為它只在 let 命令所在的代碼塊 {} 內有效。
實例
var x=10;
// 這里輸出 x 為 10
{
let x=2;
// 這里輸出 x 為 2
}
// 這里輸出 x 為 10
瀏覽器支持
Internet Explorer 11 及更早版本的瀏覽器不支持 let 關鍵字。
下表列出了各個瀏覽器支持 let 關鍵字的最低版本號。
循環作用域
使用 var 關鍵字:
實例
var i=5;
for (var i=0; i < 10; i++) {
// 一些代碼...
}
// 這里輸出 i 為 10
使用 let 關鍵字:
實例
let i=5;
for (let i=0; i < 10; i++) {
// 一些代碼...
}
// 這里輸出 i 為 5
在第一個實例中,使用了 var 關鍵字,它聲明的變量是全局的,包括循環體內與循環體外。
在第二個實例中,使用 let 關鍵字, 它聲明的變量作用域只在循環體內,循環體外的變量不受影響。
局部變量
在函數體內使用 var 和 let 關鍵字聲明的變量有點類似。
它們的作用域都是 局部的:
// 使用 var
function myFunction() {
var carName="Volvo"; // 局部作用域
}
// 使用 let
function myFunction() {
let carName="Volvo"; // 局部作用域
}
全局變量
在函數體外或代碼塊外使用 var 和 let 關鍵字聲明的變量也有點類似。
它們的作用域都是 全局的:
// 使用 var
var x=2; // 全局作用域
// 使用 let
let x=2; // 全局作用域
HTML 代碼中使用全局變量
在 JavaScript 中, 全局作用域是針對 JavaScript 環境。
在 HTML 中, 全局作用域是針對 window 對象。
使用 var 關鍵字聲明的全局作用域變量屬于 window 對象:
實例
var carName="Volvo";
// 可以使用 window.carName 訪問變量
使用 let 關鍵字聲明的全局作用域變量不屬于 window 對象:
實例
let carName="Volvo";
// 不能使用 window.carName 訪問變量
重置變量
使用 var 關鍵字聲明的變量在任何地方都可以修改:
實例
var x=2;
// x 為 2
var x=3;
// 現在 x 為 3
在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 var 關鍵字聲明的變量:
var x=2; // 合法
let x=3; // 不合法
{
var x=4; // 合法
let x=5 // 不合法
}
在相同的作用域或塊級作用域中,不能使用 let 關鍵字來重置 let 關鍵字聲明的變量:
let x=2; // 合法
let x=3; // 不合法
{
let x=4; // 合法
let x=5; // 不合法
}
在相同的作用域或塊級作用域中,不能使用 var 關鍵字來重置 let 關鍵字聲明的變量:
let x=2; // 合法
var x=3; // 不合法
{
let x=4; // 合法
var x=5; // 不合法
}
let 關鍵字在不同作用域,或不同塊級作用域中是可以重新聲明賦值的:
let x=2; // 合法
{
let x=3; // 合法
}
{
let x=4; // 合法
}
變量提升
JavaScript 中,var 關鍵字定義的變量可以在使用后聲明,也就是變量可以先使用再聲明
實例
// 在這里可以使用 carName 變量
var carName;
let 關鍵字定義的變量則不可以在使用后聲明,也就是變量需要先聲明再使用。
// 在這里不可以使用 carName 變量
let carName;
const 關鍵字
const 用于聲明一個或多個常量,聲明時必須進行初始化,且初始化后值不可再修改:
實例
const PI=3.141592653589793;
PI=3.14; // 報錯
PI=PI + 10; // 報錯
const定義常量與使用let 定義的變量相似:
兩者還有以下兩點區別:
var x=10;
// 這里輸出 x 為 10
{
const x=2;
// 這里輸出 x 為 2
}
// 這里輸出 x 為 10
const 聲明的常量必須初始化:
// 錯誤寫法
const PI;
PI=3.14159265359;
// 正確寫法
const PI=3.14159265359;
并非真正的常量
const 的本質: const 定義的變量并非常量,并非不可變,它定義了一個常量引用一個值。使用 const 定義的對象或者數組,其實是可變的。下面的代碼并不會報錯:
實例
// 創建常量對象
const car={type:"Fiat", model:"500", color:"white"};
// 修改屬性:
car.color="red";
// 添加屬性
car.owner="Johnson";
但是我們不能對常量對象重新賦值:
實例
const car={type:"Fiat", model:"500", color:"white"};
car={type:"Volvo", model:"EX60", color:"red"}; // 錯誤
以下實例修改常量數組:
實例
// 創建常量數組
const cars=["Saab", "Volvo", "BMW"];
// 修改元素
cars[0]="Toyota";
// 添加元素
cars.push("Audi");
但是我們不能對常量數組重新賦值:
實例
const cars=["Saab", "Volvo", "BMW"];
cars=["Toyota", "Volvo", "Audi"]; // 錯誤
瀏覽器支持
Internet Explorer 10 及更早版本的瀏覽器不支持 const 關鍵字。
下表列出了各個瀏覽器支持 const 關鍵字的最低版本號。
重置變量
使用 var 關鍵字聲明的變量在任何地方都可以修改:
實例
var x=2; // 合法
var x=3; // 合法
x=4; // 合法
在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 var 和 let關鍵字聲明的變量:
var x=2; // 合法
const x=2; // 不合法
{
let x=2; // 合法
const x=2; // 不合法
}
在相同的作用域或塊級作用域中,不能使用 const 關鍵字來重置 const 關鍵字聲明的變量:
const x=2; // 合法
const x=3; // 不合法
x=3; // 不合法
var x=3; // 不合法
let x=3; // 不合法
{
const x=2; // 合法
const x=3; // 不合法
x=3; // 不合法
var x=3; // 不合法
let x=3; // 不合法
}
const 關鍵字在不同作用域,或不同塊級作用域中是可以重新聲明賦值的:
const x=2; // 合法
{
const x=3; // 合法
}
{
const x=4; // 合法
}
變量提升
JavaScript var 關鍵字定義的變量可以在使用后聲明,也就是變量可以先使用再聲明
實例
carName="Volvo"; // 這里可以使用 carName 變量
var carName;
const 關鍵字定義的變量則不可以在使用后聲明,也就是變量需要先聲明再使用。
carName="Volvo"; // 在這里不可以使用 carName 變量
const carName="Volvo";
專注于技術熱點大數據,人工智能,JAVA、Python、 C 、GO、Javascript等語言最新前言技術,及業務痛點問題分析,請關注【編程我最懂】共同交流學習。
ES2015 引入了兩個重要的 JavaScript 新關鍵詞:let 和 const。
這兩個關鍵字在 JavaScript 中提供了塊作用域(Block Scope)變量(和常量)。
在 ES2015 之前,JavaScript 只有兩種類型的作用域:全局作用域和函數作用域(局部變量)。都是通過var聲明
全局(在函數之外)聲明的變量擁有全局作用域。
函數作用域或全局作用域中通過關鍵字var聲明的變量,無論在哪里聲明,都會被當成在當前作用域頂部聲明的變量,這就是JavaScript的變量提升機制。我們看下面的代碼:
變量聲明
這種變量提升機制在開發時會給我們造成很多的困擾,ECMAScript 6引入了let聲明,用法與var相同,不過用let聲明的變量不會被提升,可以把變量的作用域限制在當前代碼塊中。
我們將上述代碼中的變量用let進行聲明,如下所示:
let聲明
使用let聲明變量,還可以防止變量的重復聲明。例如在某個作用域下已經存在某個標識符,此時再使用let關鍵字聲明它,就會拋出錯誤,如下所示:
重復聲明變量
同一作用域下,不能使用let重復定義已經存在的標識符,但如果在不同的作用域下,則是可以的,這一點請讀者注意,如下所示:
在不同的作用域下
ECMAScript 6還提供了const關鍵字,用于聲明常量。每個通過const關鍵字聲明的常量必須在聲明的同時進行初始化,如下所示:
const聲明常量
與let類似,在同一作用域下用const聲明已經存在的標識符也會導致語法錯誤,無論該標識符是使用var,還是let聲明的。
如果使用const聲明對象,對象本身的綁定不能修改,但對象的屬性和值是可以修改的,我們看下面的代碼:
用const聲明對象
*請認真填寫需求信息,我們會在24小時內與您取得聯系。