做論壇網(wǎng)站需要什么備案網(wǎng)站友鏈交換平臺
1.let/const和var的區(qū)別
1.變量提升:var會發(fā)生變量提升,let和const不存在變量提升
2.暫時性死區(qū):變量聲明之前變量不可用稱為暫時性死區(qū)。var不存在,let和const存在暫時性死區(qū)
3.typeof?不再是百分百不會報錯:let聲明前不能使用typeof
typeof x; // Uncaught ReferenceError: Cannot access 'x' before initializationlet x;
4.不允許重復聲明:var重復聲明會覆蓋前一個,let和const不允許重復聲明(用var聲明過的也不允許let和const聲明)
5.函數(shù)內部:var聲明過的也不允許let和const聲明,有形參后,不能再使用let聲明
// 函數(shù)內部
function get(){var b =1;let b =6;
}function get(b){let b
}
2.塊級作用域
1.?為什么要有塊級作用域?
ES5?只有全局作用域和函數(shù)作用域,沒有塊級作用域,這帶來很多不合理的場景
第一種場景,內層變量可能會覆蓋外層變量。
var tmp = new Date();
function f() {
console.log(tmp);if (false) {var tmp = 'hello world';}}
f(); // undefined
第二種場景,用來計數(shù)的循環(huán)變量泄露為全局變量for?(var?i?=?0;?i?<?s.length;?i++){}
2.?特點:允許塊級作用域的任意嵌套,里面可以訪問外面的,外面不可以訪問里面的
每一層都是一個單獨的作用域。每一層中的數(shù)據(jù)是不互通的。(里面可以訪問外面的,外面不可以訪問里面的)
{{let a = 123;}console.log(a) // 報錯
}// 里面可以訪問外層的a
{{let a = 123;{console.log(a)}}}
3.?對比es5之前的代碼塊:需要使用匿名函數(shù)進行嵌套
let a = '全局';{let a = '局部'console.log(a);}console.log(a);var aa = '全局';(function(){var aa = '局部'console.log(aa);})()console.log(aa);
3.const特殊的地方
1.?const聲明一個只讀的常量。一旦聲明,常量的值就不能改變
2.?const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值
3.內存地址不變?里面的東西可以邊
const foo = {};
// 為 foo 添加一個屬性,可以成功foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個對象,就會報錯
foo = {}; // TypeError: "foo" is read-only
4.如果真的想將對象凍結,應該使用Object.freeze方法。const不能真正凍結對象
常量foo指向一個凍結的對象,所以添加新屬性不起作用,嚴格模式時還會報錯。
const foo = Object.freeze({});
// 常規(guī)模式時,下面一行不起作用;// 嚴格模式時,該行會報錯
foo.prop = 123;
'use strict';
const foo = Object.freeze({});
foo.prop = 123; // 報錯
5.for循環(huán)內使用let變量。
for循環(huán)還有一個特別之處,就是設置循環(huán)變量的那部分是一個父作用域,而循環(huán)體內部是一個單獨的子作用域。
這種for循環(huán)和循環(huán)體內使用的是用一個變量,所以最后輸出的是6
var a = [];
for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);};}
a[6](); // 6
以下這種,for循環(huán)和循環(huán)體內都由單獨的作用域變量,所以每次輸出的都是自己作用域的變量‘a(chǎn)bc’?
for (let i = 0; i < 3; i++) {let i = 'abc';console.log(i);
}
// abc// abc// abc