JS變量中有var定義和無var定義的區(qū)別以及es6中l(wèi)et命令和const命令
之前我們在寫js代碼的時(shí)候都知道可以用var定義全局變量和局部變量,也可以省略var,而且在非嚴(yán)格模式下不會(huì)報(bào)錯(cuò),但是并不知道兩者的區(qū)別...
var x = 1; y = 4; console.log(x);//1 console.log(y);//4 console.log(window.x);//1 console.log(window.y);//4
簡單測試下可以知道定義的x和y都被掛載在window對象上,變?yōu)閣indow下的屬性,這并不能說明什么...
delete x; delete y; console.log(window.x);//1 console.log(window.y);//undefined
再看看執(zhí)行上面代碼之后x屬性沒有被刪除,y被刪除了,這是區(qū)別就來了
在通過var進(jìn)行定義后的變量不能被delete刪除,這是什么原因?ECMAScript 5標(biāo)準(zhǔn)中,可以通過Object.getOwnPropertyDescriptor()來獲取對象自身某個(gè)property的屬性信息:
console.log(Object.getOwnPropertyDescriptor(window,"x")); console.log(Object.getOwnPropertyDescriptor(window,"y"));
得到如下信息:
當(dāng)不使用var進(jìn)行定義是,變量默認(rèn)的configurable為true,可以進(jìn)行delete等命令進(jìn)行操作,而當(dāng)var在定義一個(gè)全局變量的時(shí)候configurable 變?yōu)榱薴alse,即不會(huì)被delete刪除.
此外,簡單說一下關(guān)于變量提升問題
alert(a);//Uncaught ReferenceError: a is not defined a = 100;alert(b);//undefined
var b = 200;先說第二段代碼,var聲明的全局變量b在js中會(huì)進(jìn)行代碼提升,也就是說var b = 200;會(huì)被分解為var b;b=200;代碼解析的第時(shí)候會(huì)將var b;提升到最前面,并且在內(nèi)存中開辟一個(gè)空間,由于b沒有被賦值,默認(rèn)為undefined.第一段代碼中當(dāng)js執(zhí)行alert()函數(shù)時(shí)候由于沒有進(jìn)行var聲明,變量沒有被提升,不存在內(nèi)存開辟,所以在alert時(shí)候直接報(bào)錯(cuò)!
在ECMAScript6標(biāo)準(zhǔn)中,一個(gè)重要的概念就是"JavaScript嚴(yán)格模式",需要在最前面加上"use strict";
let注意點(diǎn):
1.let擁有塊級作用域,一個(gè){}就是一個(gè)作用域
2.let在其作用域下面不存在變量提升
3.let在其作用域中不能被重復(fù)聲明(函數(shù)作用域和塊級作用域)
第一點(diǎn):let的塊級作用域
注意:以下代碼都在嚴(yán)格模式下執(zhí)行的
let n = 10; if(true){ let n = 50; } console.log(n);//10表示外層代碼塊不受內(nèi)層代碼塊的影響,如果是用var定義的變量n,那么輸出的就是修改后的50.
第二點(diǎn):變量提升問題
alert(a);//Uncaught ReferenceError: a is not defined let a = 100;
不同var,let不存在變量提升,以上寫法會(huì)直接報(bào)錯(cuò).
第三點(diǎn):重復(fù)聲明問題
(function(){ let lTest = "let"; var vTest = "var" let lTest = "let changed";//Uncaught SyntaxError: Identifier 'lTest' has already been declared var vTest = "var changed"; console.log(lTest); console.log(vTest); })();
let在同一個(gè)作用域下不允許進(jìn)行重復(fù)變量聲明.否則也是直接報(bào)錯(cuò)!!!
const命令
const用來聲明常量,一旦聲明,其值就不可以更改,如果你非得修改變量的值,js不會(huì)報(bào)錯(cuò),只是默默表示失敗(不起作用)
const的作用域與let相同,只在聲明所在的塊級作用域內(nèi)有效,并且也是和let一樣不可以重復(fù)進(jìn)行聲明.
相關(guān)文章
JavaScript創(chuàng)建對象的幾種方式及關(guān)于this指向問題
這篇文章主要介紹了JavaScript創(chuàng)建對象的幾種方式及關(guān)于this指向問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值。需要的小伙伴可以參考一下2022-07-07在JavaScript中對HTML進(jìn)行反轉(zhuǎn)義詳解
下面小編就為大家?guī)硪黄贘avaScript中對HTML進(jìn)行反轉(zhuǎn)義詳解。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05學(xué)習(xí)JavaScript設(shè)計(jì)模式之狀態(tài)模式
這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的狀態(tài)模式,對JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下2016-01-01web-view實(shí)現(xiàn)app應(yīng)用與網(wǎng)頁的數(shù)據(jù)交互方式
這篇文章主要介紹了web-view實(shí)現(xiàn)app應(yīng)用與網(wǎng)頁的數(shù)據(jù)交互方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05