javascript?變量聲明?var,let,const?的區(qū)別
作用域(Scope)是什么
作用域是程序的執(zhí)行環(huán)境,它包含在當(dāng)前位置可訪問的變量和函數(shù)。在 ES5 語法中,有全局作用域和局部作用域,ES6 則新增了塊級(jí)作用域。
全局作用域是最外層的作用域,在函數(shù)外面定義的變量屬于全局作用域,可以被任何其他子作用域訪問。在瀏覽器中,window 對(duì)象就是全局作用域。在編寫前端代碼過程中,其中有一條優(yōu)化規(guī)則就是少使用全局變量,因?yàn)槿肿兞咳菀讓?dǎo)致程序BUG,并且不容易查找。
局部作用域的基本單元是 function
,只在函數(shù)體內(nèi)有效。局部作用域是在函數(shù)內(nèi)部的作用域。在局部作用域定義的變量只能在該作用域以及其子作用域被訪問。
javascript中,變量聲明使用 var
、const
、let
來聲明變量,var
為ES5的語法,const
和let
為ES6之后的語法。ES6 的let
和const
為新引入的關(guān)鍵字,它們不會(huì)被提升,而且是塊作用域。也就是說被大括號(hào)包圍起來的區(qū)域聲明的變量外部將不可訪問。
下面我們就來說說各自的區(qū)別。
var 聲明
var
聲明,為ES5的語法,var
聲明的變量總是歸屬于包含函數(shù)(即全局,如果在最頂層的話)。在 javaScript 函數(shù)內(nèi)部聲明的變量(使用 var
)是局部變量,所以只能在函數(shù)內(nèi)部訪問它(該變量的作用域是局部的)??梢栽诓煌暮瘮?shù)中使用名稱相同的局部變量,因?yàn)橹挥新暶鬟^該變量的函數(shù)才能識(shí)別出該變量。
提升(Hoisting)
在編譯過程中,將var
和function
的定義移動(dòng)到他們作用域最前面的行為叫做提升。
整個(gè)函數(shù)定義會(huì)被提升。所以,可以在函數(shù)還未定義之前調(diào)用它,而不用擔(dān)心找不到該函數(shù)。
console.log(toSquare(3));?//?9 function?toSquare(n)?{ ????return?n?*?n; }
變量只會(huì)被部分提升。而且只有變量的聲明會(huì)被提升,賦值不會(huì)動(dòng)。
開發(fā)者可能最希望實(shí)現(xiàn) for
循環(huán)的塊級(jí)作用域了,因?yàn)榭梢园央S意聲明的計(jì)數(shù)器變量限制在循環(huán)內(nèi)部。
for?(var?i?=?0;?i?<?10;?i++)?{ ????console.log(i); }
立即執(zhí)行函數(shù)能夠有效解決:
for?(var?i?=?0;?i?<?10;?++i)?{ ????(function?(value)?{ ????????console.log(value); ????})(i); }
再來看一個(gè)例子
(function?()?{ ????var?testValue?=?"hello"; ????var?testFunc?=?function?()?{ ????????console.log("just?test"); ????}; })(); console.log(window.testValue);?//?undefined console.log(window.testFunc);?//?undefined
趣題:
var?x?=?10; var?y?=?20; [y,?x]?=?[x,?y]; console.log(x,?y);?//?20?10
let 聲明
過早訪問 let
聲明的引用導(dǎo)致的這個(gè)referenceerror
叫做臨時(shí)死亡區(qū)錯(cuò)誤,在訪問一個(gè)已經(jīng)聲明但還沒有初始化的變量。創(chuàng)建一個(gè)塊作用域。
let?g1?=?"global?1"; let?g2?=?"global?2"; { ????g1?=?"new?global?1"; ????let?g2?=?"local?global?2"; ????console.log(g1);?//?new?global?1 ????console.log(g2);?//?local?global?2 ????console.log(g3);?//?ReferenceError:?g3?is?not?defined ????let?g3?=?"I?am?not?hoisted"; }
const 聲明
const
是對(duì)賦值做鎖定,不對(duì)值的改變鎖定。例如:數(shù)組、對(duì)象。 一個(gè)常見的誤解是:使用const
聲明的變量,其值不可更改,但是對(duì)于數(shù)組和對(duì)象,其值是可以更改的。
const?tryMe?=?"initial?assignment"; //下面重新賦值會(huì)導(dǎo)致程序錯(cuò)誤 tryMe?=?"this?has?been?reassigned";?//?TypeError:?Assignment?to?constant?variable. //對(duì)于數(shù)組是可以更改元素值 const?array?=?["Ted",?"is",?"awesome!"]; array[0]?=?"Barney"; array[3]?=?"Suit?up!"; console.log(array);?//?[?'Barney',?'is',?'awesome!',?'Suit?up!'?] //下面這樣更改整個(gè)數(shù)組,相對(duì)于重新賦值,是錯(cuò)誤的 array?=?["Barney",?"is",?"awesome!",?"Suit?up!"]; //?同樣對(duì)于對(duì)象 const?airplane?=?{}; airplane.wings?=?2; airplane.passengers?=?200; console.log(airplane);?//?{?wings:?2,?passengers:?200?} //下面是錯(cuò)誤 airplane?=?{?wings:?2,?passengers:?200?};
對(duì)于支持ES6的語法,建議默認(rèn)使用
const
, 在確實(shí)需要改變的變量聲明使用 let, 這樣可以在某種程度上實(shí)現(xiàn)代碼的不可變。從而可以避免很多的問題的出現(xiàn)。
到此這篇關(guān)于javascript 變量聲明 var,let,const 的區(qū)別的文章就介紹到這了,更多相關(guān)JS var,let,const 的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Js中var,let,const的區(qū)別你知道嗎
- Javascript?中?var?和?let?、const?的區(qū)別及使用方法
- javascript中var與let、const的區(qū)別詳解
- JavaScript變量中var,let和const的區(qū)別
- 淺談JS中var,let和const的區(qū)別
- JavaScript變量聲明的var、let、const詳解
- 面試官常問之說說js中var、let、const的區(qū)別
- JavaScript?ES6語法中l(wèi)et,const?,var?的區(qū)別
- javascript的var與let,const之間的區(qū)別詳解
- JavaScript中var let const的用法有哪些區(qū)別
- JavaScript es6中var、let以及const三者區(qū)別案例詳解
- 詳解javascript中var與ES6規(guī)范中l(wèi)et、const區(qū)別與用法
- 了解javascript中l(wèi)et和var及const關(guān)鍵字的區(qū)別
- 5分鐘快速掌握J(rèn)S中var、let和const的異同
- JavaScript中var、let、const區(qū)別淺析
- JavaScript變量聲明var,let.const及區(qū)別淺析
- JavaScript ES6中const、let與var的對(duì)比詳解
- JS變量中有var定義和無var定義的區(qū)別以及es6中l(wèi)et命令和const命令
- JavaScript中const、var和let區(qū)別淺析
- JavaScript聲明變量的這四兄弟(var、let、function、const)
相關(guān)文章
js is_valid_filename驗(yàn)證文件名的函數(shù)
有時(shí)候我們需要對(duì)文件名進(jìn)行控制,包括一些特殊命名的文件與特殊符號(hào)的文件名進(jìn)程替換,那么就可以使用下面的函數(shù)2017-07-07如何在JavaScript中創(chuàng)建具有多個(gè)空格的字符串?
這篇文章主要介紹了如何在JavaScript中創(chuàng)建具有多個(gè)空格的字符串?,需要的朋友可以參考下2020-02-02詳解JavaScript 浮點(diǎn)數(shù)運(yùn)算的精度問題
這篇文章主要介紹了詳解JavaScript 浮點(diǎn)數(shù)運(yùn)算的精度問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07JavaScript 獲取事件對(duì)象的注意點(diǎn)
平時(shí)我們獲取事件對(duì)象一定要將firefox考慮進(jìn)去。2009-07-07HTML+CSS+JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果
這篇文章主要為大家詳細(xì)介紹了HTML+CSS+JavaScript實(shí)現(xiàn)簡(jiǎn)單日歷效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07JavaScript常用函數(shù)工具集:lao-utils
現(xiàn)在Javascript庫(kù)海量,流行的也多,比如jQuery,YUI等,雖然功能強(qiáng)大,但也是不萬能的,功能不可能涉及方方面面,這里給大家分享一個(gè)的JS庫(kù)是對(duì)這些的補(bǔ)充,很多也比較實(shí)用,把應(yīng)用到項(xiàng)目中中去也比較方面,這也是對(duì)工作的一些積累,也加深對(duì)知識(shí)的理解。2016-03-03JS字符串與二進(jìn)制的相互轉(zhuǎn)化實(shí)例代碼詳解
這篇文章主要介紹了JS字符串與二進(jìn)制的相互轉(zhuǎn)化 ,在文中給大家提到了Js之字符串和字節(jié)碼之間的相互轉(zhuǎn)換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06