溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

web中l(wèi)et和const的示例分析

發(fā)布時間:2021-10-19 17:55:25 來源:億速云 閱讀:207 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)web中l(wèi)et和const的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

  1. 塊級作用域

在ES6之前我們腦海里應(yīng)該只存在全局作用域和函數(shù)級作用域,沒有塊級作用域。那么為什么要引入塊級作用域呢?

  • 避免外層變量被覆蓋

var str = "hello";
function d() {
  console.log(str);
  if (false) {
    var str = 'world';
  }
}
d();//undefined

相信很多剛?cè)腴T的同學(xué)看到上述代碼會有所不解,其實在全局作用域str變量已經(jīng)被聲明且復(fù)制,為什么我函數(shù)里面訪問不到呢。這里就牽扯到變量提升和函數(shù)級作用域的概念。上述代碼其實等同于下放代碼,當(dāng)函數(shù)被執(zhí)行的時候生成了一個新的作用域也就是函數(shù)作用域,js引擎會把變量聲明提到方法體的最前面,大家可以看到只是聲明了并沒有賦值。所以就是 undefined。

var str = "hello";
function d() {
  var str ;
  console.log(str);
  if (false) {
    str = 'world';
  }
}
d();//undefined
  • 循環(huán)變量污染全局變量

var str = 'hello';
for (var i = 0; i < str.length; i++) {
  console.log(str[i]);
}
console.log(i); // 5

很多同學(xué)面試的時候可能會遇到上面類似的代碼,疑惑點應(yīng)該在為什么會打印出來為什么會是5,同樣的道理代碼如同下方。變量會被提升,所以在循環(huán)結(jié)束之后i就被累加到了5.

var str = 'hello';
var i;
for ( i = 0; i < str.length; i++) {
  console.log(str[i]);
}
console.log(i); // 5

es6的let和const聲明符,是不存在變量提升的;同時也只在塊級作用域生效。

這個答案應(yīng)該很明顯了吧

var str = "hello";
function d() {
  console.log(str);
  if (false) {
    let str = 'world';
  }
}
d();
  1. 暫時性死區(qū)MDN

什么是暫時性死區(qū)呢?很多人可能很迷惑。那就聽我娓娓道來,如果說我們使用了let和const命令,作用域內(nèi)會對這些命令聲明的變量,在它的聲明周期內(nèi)形成一種封閉作用域。這在語法上,稱為“暫時性死區(qū)”。代碼展示如下:

if (true) {
  tmp = 'abc'; // ReferenceError
  console.log(tmp); // ReferenceError
  let tmp;
  console.log(tmp); // undefined
  tmp = 123;
  console.log(tmp); // 123
}

因為let和const聲明是不會被提升的,所以為了保障聲明的有效性,js的解釋引擎會對變量所處的塊級作用域形成一種保護,因此在聲明之前使用會有語法錯誤,是不被允許的。

不能重復(fù)聲明

function de(){
	var a = "1";
	var a = "2";
	console.log(a);
}
de()//不報錯

function de(){
	var a = "1";
	let a = "2";
	console.log(a);
}
de()//報錯

function de(){
	let a = "1";
	let a = "2";
	console.log(a);
}
de()//報錯

相信大家一般不會聲明重復(fù)變量編碼,所以在這里就不做解釋了。如果大家感興趣可以自己研究或者來現(xiàn)場一起學(xué)習(xí)。

  1. const常量

const聲明符的大多特性和let相同,這里就不多做解釋了。大家都知道const是聲明常量的,一但變量被聲明成常量它就不能再被繼續(xù)修改了。大家要注意的是這里變量不可被修改的是存儲的地址值不可被修改,意思就是簡單類型的數(shù)據(jù)是不能修改的。復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組)const只能保證這個指針是固定的,而這個具體的對象實例包含的屬性是可以被修改的??纯创a我們可能會更清楚:

//實例一
const a = "hello";
console.log(a);//"hello"

a = "world";//Assignment to constant variable

//實例二
const obj = {};
obj.name = "jack";
console.log(obj.name);//"jack"

obj = {};//Assignment to constant variable.

//實例三
const a = [];
a.push('Hello');
console.log(a); //[ 'Hello' ]
a.length = 0;
a = ['Dave'];    // Assignment to constant variable.

正如大家所看到的字符串a(chǎn)被復(fù)制后就不能在修改,而對象和數(shù)組是可以改變它里面的元素的,但是不能給重新復(fù)制一個新的對象實例。由此就可以斷定const聲明出來的變量存的是固定的地址值。

關(guān)于“web中l(wèi)et和const的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI