JavaScript中的變量聲明你知道嗎
變量
ECMAScript中,變量可以保存任何類型的數(shù)據(jù)(既可以是字符串也可以是數(shù)組也可以是別的……),也即“松散的”,變量只是一個用來區(qū)分的占位符,一共有var、const、let三個關鍵字用于聲明變量(var在ECMAScrip所有版本可用,后兩個只在ES6及以后可用)。
(一)var
var a;//僅定義 var b=‘hi';//定義的同時,設置值
要注意的是,值的設置可以覆蓋,但我們不推薦這么做
var a=”hello” a=”hi”
ECMAScript的變量是“松散”的,那么可以用一條語句來對不同的數(shù)據(jù)類型初始化的聲明,當然插入、換行不是必要的,只是一定要用逗號隔開不同的變量。
Var a=“hello”, b=12, c=false;
1)關于var聲明的變量的作用域
function test(){ var a="shanxi"; } test();//調用函數(shù) console.log(a); //ReferenceError: a is not defined //報錯:a未定義
變量在使用var定義時,若是在函數(shù)內部,則該變量在函數(shù)退出時將會被銷毀,無法再調用。這里的a在函數(shù)test內部使用var完成定義,調用函數(shù)test之后,隨即a便被銷毀,因而出現(xiàn)如上報錯。
當省略關鍵詞var時,這樣定義的變量將成為全局變量(不過不建議這么做,太多的全局變量會讓程序變得難以維護)
function test(){ a="sichuan"; } test();//調用函數(shù) console.log(a); //sichuan
2)var聲明提升(hoist)
如下,結果是undefined而并沒有報錯,是因為,使用var關鍵字聲明的變量,會自動提升到函數(shù)作用域的頂部。也就是,會被ECMAScript看作
function test(){ console.log(a) var a=12; } test() //undefined
也就是,會被ECMAScript看作
function test(){ var a; console.log(a) a=12; } test() //undefined
這種“提升”,會把所有變量的聲明都提到函數(shù)作用域的頂部。
(二)let
Let和var作用相似,只是let聲明的范圍是塊作用域,var聲明的范圍是函數(shù)作用域
例如如下的if語句中的{}就是一個“塊”,而不是一個函數(shù)作用域。
if(true){ var b="zhang" console.log(b);//zhang } console.log(b);//zhang
換成let:
if(true){ let b="zhang" console.log(b);//zhang } console.log(b);//ReferenceError: b is not defined
此時b在if外邊(定義b的塊作用域外)便不能被引用。
?。?!注意:塊作用域是函數(shù)作用域的子域(是前者不一定是后者是后者不一定是前者)。
?。?!注意:適用于var的作用域限制,對let是等同的(只是一個作用域是函數(shù)作用域一個是塊作用域)。
關于重復聲明,var不報錯而let會報錯,看如下實例:
var a=24;var a=12;var a=5;console.log(a);//5let b=2;let b=4;//SyntaxError: Identifier 'b' has already been declared//運行到此處就已經(jīng)報錯let b=8;console.log(b);var a=24; var a=12; var a=5; console.log(a);//5 let b=2; let b=4;//SyntaxError: Identifier 'b' has already been declared //運行到此處就已經(jīng)報錯 let b=8; console.log(b);
關于嵌套使用,JavaScript會記錄用于變量聲明的標識符以及其所在塊的作用域,所以在嵌套使用時,不會報錯(因為在同一塊作用域中沒有重復聲明)。
var a="shanxi" console.log(a);//shanxi if(true){ var a="sichaun"; console.log(a);//sichuan } let b=3; console.log(b);//3 if(true){ let b=5; console.log(b);//5 }
所以,let和var區(qū)別只在于,二者決定所聲明的變量的相關作用域存在。
var a; let a;//SyntaxError: Identifier 'a' has already been declared let c; var c;//SyntaxError: Identifier 'c' has already been declared
1)與var不同,let聲明的變量不會再作用域中被提升,這一現(xiàn)象被稱為“暫時性死區(qū)”
console.log(a); var a=2;//undefined console.log(b); let b=3;//ReferenceError: Cannot access 'b' before initialization
2)全局聲明
Var在全局作用域中聲明出的變量自動會成為window對象的屬性,但let不會
var a=3; console.log(window.a)//a let b=10; console.log(window.b);//undefined
不過let聲明出的變量,依舊是全局作用域發(fā)生的(不然也不會是“undeifned”),變量也會在頁面的生命周期內存續(xù),所以必須保證頁面不會重復聲明同一個變量
(三)Const
基本上和let相同,只是使用const時,必須同時初始化變量,且嘗試修改const聲明的變量時會報錯
const n="zhang"; n="li";//TypeError: Assignment to constant variable. const a=12; const a=9;//不可以重復聲明 //SyntaxError: Identifier 'a' has already been declared
當然,const有關聲明的限制,只適用于它指向的變量本身的引用,也就是說,若為一個對象,那么修改這一對象內部屬性,不會違反const有關的限制。
const house={};
house.name=”myhouse”;
那么,在let和const出現(xiàn)之后,許多開發(fā)者不再很多地使用var了,多使用let和const,使得變量有了明確的作用域、聲明位置以及不變的值。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
JS實現(xiàn)的RGB網(wǎng)頁顏色在線取色器完整實例
這篇文章主要介紹了JS實現(xiàn)的RGB網(wǎng)頁顏色在線取色器,結合完整實例形式分析了基于JS運算及鼠標事件響應來操作頁面元素實現(xiàn)取色器功能的方法,具有一定參考借鑒價值,需要的朋友可以參考下2016-12-12js獲取網(wǎng)頁可見區(qū)域、正文以及屏幕分辨率的高度
這篇文章主要介紹了js獲取網(wǎng)頁的各種高度,例如可見區(qū)域、正文以及屏幕分辨率的高度,需要的朋友可以參考下2014-05-05User Scripts: Video Download by User Scripts
User Scripts: Video Download by User Scripts...2007-05-05微信公眾平臺 客服接口發(fā)消息的實現(xiàn)代碼(Java接口開發(fā))
這篇文章主要介紹了微信公眾平臺 客服接口發(fā)消息的實現(xiàn)代碼(Java接口開發(fā)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04