let命名
- 所聲明的變量只在命令所在的代碼塊內(nèi)有效
{
let a = 1;
var b = 2;
console.log(a) // 1
console.log(b) // 2
}
console.log(a) // a is not defined
console.log(b) // 2
- 使用let聲明的命令變量在域解析的時(shí)候不會(huì)被提升
{
console.log(b); // b is not defined
let b = 2;
}
{
let f = 10;
function fn(){
f = 7;
let f = 2; // 暫時(shí)性死區(qū)
}
fn();
}
- let不允許在同一個(gè)作用域下聲明已經(jīng)存在的變量
{
let a = 1;
let a = 2; //報(bào)錯(cuò) 'a' has already been declared
}
- let在循環(huán)中應(yīng)用
for ( let i = 0; i < btns.length; i++){
btns[i].onclick = function(){
console.log(i) //0,1,2,3,4....
//在這里鲸伴,let與var的區(qū)別是:let只是在循環(huán)之中的崇败,而var在整個(gè)函數(shù)之中
}
}
console.log(i) // i is not defined
var a = [];
for ( var i = 0 ; i< 10 ; i ++){
a[i] = function(){
console.log(i)
}
}
a[6](); // 10
var b = [];
for ( let i = 0; i < 10; i ++){
b[i] = function(){
console.log(i)
}
}
b[6](); // 6
- 暫時(shí)性死區(qū) 使用let命令聲明變量之前碎税,該變量不能使用
var tmp = 123;
if ( true){
tmp = 'abc'; // tmp is not defined
let tmp; // 在這個(gè)代碼塊中定義了tmp
}
let tmp2 = 123;
if (true){
tmp2 = 'abc';
console.log(tmp2)
}
console.log(tmp2)
塊級(jí)作用域
-
為什么需要塊級(jí)作用域
- 內(nèi)層變量可能會(huì)覆蓋外層變量
var tmp = new Date(); function f(){ console.log(tmp); if (false){ var tmp = "hello" } } f(); // undefined
- 用來計(jì)數(shù)的循環(huán)變量泄露為全局變量
-
ES6 的塊級(jí)作用域
- 外層作用塊不受內(nèi)層作用塊的影響
function f(){ let n = 5; if ( true){ n = 10 } console.lo(n) // 5 外層作用塊不受內(nèi)層作用塊的影響 }
- 外層作用域無法訪問內(nèi)層作用域的變量
{let now = '1213'} console.log(now) // now is not defined
- 內(nèi)層作用域可以定義外層作用域相同的變量
{{ let name = 'dan' { let name = 'xxi' } }}
- 立即執(zhí)行的匿名函數(shù)(IIFE)不再有必要
/*(function(){ console.log('asdklfj'); document.body.backgroundColor = '#f5f5f5'; })()*/ { console.log('jaflkajsd'); }
- 內(nèi)部聲明的函數(shù)不會(huì)影響到外部聲明
{ let a = 'secret'; function f(){ return a } } f() //報(bào)錯(cuò) let f; let b = 'bbb' { let a = 'dan'; f = function(){ return a; } console.log(b); // 內(nèi)層作用塊還是可以拿到外層作用塊的內(nèi)容 } console.log(f());
const命名
- const 聲明的變量一旦聲明,其值就不能發(fā)生改變拔妥,一旦聲明常量抄肖,就必須初始化咒锻,不能留到以后賦值
const PI = 3.1415;
PI = 3; // 報(bào)錯(cuò)
聲明的常量只在其所在的代碼塊內(nèi)有效府框,
聲明的常量不會(huì)被提升,同樣有暫時(shí)性死區(qū)若厚,只能在聲明后使用
不能聲明已經(jīng)聲明過的常量或者變量
注:
- 聲明的時(shí)候必須賦值
- 聲明的常量?jī)?chǔ)存簡(jiǎn)單的數(shù)據(jù)類型是不可改變其值拦英,如果儲(chǔ)存的是對(duì)象,那么引用不可改變测秸,至于對(duì)象里數(shù)據(jù)怎么改變是沒有關(guān)系的
const obj = { a: 10};
obj.a = 20;
console.log(obj) // {a: 20}
const a = [];
a.push('hello'); // 可以執(zhí)行
a.length = 0; // 可以執(zhí)行
a = ["dan"] // 報(bào)錯(cuò)
- 如果想將對(duì)象凍結(jié)疤估,使用Object.freeze({});
const foo = Object.freeze({});
foo.prop = 123; // 不起作用
console.log(foo.prop) // undefined
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach((key,value) => {
if ( typeof obj[key] === 'object'){
constantize(obj[key])
}
})
}