ES5 有兩種聲明變量的方法:var 和 function命令
ES6 有六種聲明變量的方法:var 吴菠、 function 澜驮、let 昭雌、const 图毕、import盹舞、class命令叙量。
ES6 中新增了 let 和 const 來定義變量:
var:ES5 和 ES6中倡蝙,定義全局變量(是variable的簡寫)。
let:定義
局部變量
绞佩,替代 var寺鸥。const:定義
常量
(定義后,不可修改)品山。
var:全局變量
看下面的代碼:
{
var a = 1;
}
console.log(a); //這里的 a胆建,指的是 區(qū)塊 里的 a
上方代碼是可以輸出結(jié)果的,輸出結(jié)果為 1肘交。因為 var 是全局聲明的笆载,所以,即使是在區(qū)塊里聲明涯呻,但仍然在全局起作用凉驻。
再來看下面這段代碼:
var a = 1;
{
var a = 2;
}
console.log(a); //這里的 a,指的是 區(qū)塊 里的 a
上方代碼的輸出結(jié)果為 2 复罐,因為 var 是全局聲明的涝登。
用 var 定義的全部變量,有時候會污染整個 js 的作用域市栗。
要習(xí)慣用let聲明缀拭,減少var聲明去污染全局空間,在vue的使用中也要注意這點填帽。
ES6 新增了let命令蛛淋,用來聲明變量。它的用法類似于var篡腌,但是所聲明的變量褐荷,只在let命令所在的代碼塊內(nèi)有效。
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
const 聲明的是一個只讀的變量嘹悼,一旦聲明叛甫,不可更改,這就意味著一旦聲明就必須初始化杨伙,不然會報錯其监,const作用域和let作用域一樣.
全局變量的屬性
window.a = 1;
var a = 2 ;
console.log(a); // 2
console.log(window.a); // 2
window.b = 1;
let b = 2 ;
console.log(b); // 2
console.log(window.b); // 1
- 塊級作用域
ES5只有全局作用域和函數(shù)作用域,會出現(xiàn)以下的問題
//內(nèi)層變量覆蓋了外層變量
var number = 5;
show();
function show(){
console.log(number); // undefined
var number = 10 ;
}
//i泄露成全局變量
var string = 'hello';
for(var i = 0 ;i<string.length ;i++){
console.log(string[i]); // h e l l o
}
console.log(i); // 5
ES6塊級作用域?qū)懛ǎ▔K級作用域可以無限嵌套限匣,可以代替ES5的匿名函數(shù)IIFE)
{
let number = 5;
console.log(number); // 5
{
let number = "hello";
console.log(number); // hello
}
}
ES5嚴(yán)格模式下抖苦,函數(shù)不能在塊級中聲明,ES6明確規(guī)定可以在塊級作用域中聲明函數(shù),但聲明的函數(shù)有點類似let锌历,在塊級作用域之外不可引用贮庞,由于瀏覽器可以忽略以上規(guī)則,所以盡量避免在塊級作用域中聲明函數(shù)究西。
//ES5非嚴(yán)格模式
if(true){
function show(){ //不報錯
};
}
//ES5嚴(yán)格模式
'use strict';
if(true){
function show(){ //直接報錯
};
}
//ES6嚴(yán)格模式
'use strict';
if(true){
function show(){ //不報錯
};
}