作用域,變量的作用范圍
在ES6之前
變量的聲明
只有var可以聲明變量屬于某個(gè)作用域,并且,也只有全局作用域和函數(shù)作用域。(沒(méi)有var聲明的變量,屬于全局作用域,在全局作用域里聲明的變量,函數(shù)會(huì)成為全局的屬性)
所有的變量,不是全局作用域的,就是函數(shù)作用域的。
如果用var 聲明變量,并且是在函數(shù)中,那么這個(gè)變量就屬于這個(gè)函數(shù),否則,屬于全局變量。
提升
在JavaScript的任何一個(gè)作用域中,都存在提升;
對(duì)于一個(gè)聲明var a=2;引擎主要會(huì)分兩步走,var a; a=2; JS引擎進(jìn)行處理和執(zhí)行。
所謂的處理,引擎首先會(huì)進(jìn)行全局的掃描,遇到變量的聲明(var 聲明的變量)就會(huì)記錄,遇到函數(shù)聲明(function 關(guān)鍵字開(kāi)頭)也會(huì)進(jìn)行記錄,直到全局掃描完畢。然后,引擎開(kāi)始從頭執(zhí)行,對(duì)變量進(jìn)行修改,對(duì)函數(shù)進(jìn)行調(diào)用。
上邊所謂的記錄,就是提升行為。(如果學(xué)過(guò)C語(yǔ)言,就知道,函數(shù),變量都要先定義,在使用,否則會(huì)報(bào)錯(cuò),但是,js提升,可以理解為,不管你定義在哪里,都會(huì)被提升到使用的前面,也就是可以把使用寫在定義前面)
引擎會(huì)把聲明的變量,函數(shù)聲明記錄到全局的作用域,記錄有哪些變量存在,并對(duì)變量進(jìn)行初始化賦值,undefined;為什么是記錄到全局,而不是對(duì)應(yīng)作用域,主要是因?yàn)?,一開(kāi)始掃描,就是掃描全局作用域,它只掃描一級(jí), 它不會(huì)深入掃描,只掃描表面。這個(gè)其實(shí)很好理解,除了變量的提升,還有函數(shù)聲明的提升,遇到function 關(guān)鍵字,js引擎只是簡(jiǎn)單的將其提升到最頂層,在全局作用域中定義的函數(shù),它作用域就相當(dāng)于二級(jí),js引擎是不會(huì)在這個(gè)時(shí)候去掃描函數(shù)作用域的。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | var a=1; //全局 a1=11; //全局 function one(){ var b=2; b1=22; //全局 } //打開(kāi)瀏覽器 a:1 b:Uncaught ReferenceError: b is not defined //因?yàn)閎是局部變量 a1:11 b1:Uncaught ReferenceError: b1 is not defined //很容易可以看出one函數(shù)沒(méi)有被掃描 one(); //調(diào)用one函數(shù) a:1 b:Uncaught ReferenceError: b is not defined //因?yàn)閎是局部變量 a1:11 b1:22 window.a:1 window.a1:11 window.b1:22 window.b:undefined |
對(duì)于函數(shù)作用域內(nèi)部的提升,發(fā)生在函數(shù)被調(diào)用的之后,執(zhí)行之前,同樣會(huì)進(jìn)行表面的掃描,記錄附屬于這個(gè)作用域的變量,函數(shù)。
如果在一個(gè)作用域中遇到變量和函數(shù)名相同,那么,函數(shù)的優(yōu)先級(jí)高,這個(gè)標(biāo)識(shí)符任然是函數(shù)名。
ES6
對(duì)變量的聲明多了:var ,let ,const;
對(duì)于var的,沒(méi)有變化,同ES6之前?!?/p>
let聲明變量,const聲明常量,對(duì)于這兩個(gè),他們有的是塊級(jí)作用域,只要是 { ... },圍成的區(qū)域,就是塊級(jí)作用域。
在塊級(jí)作用域里,let,const聲明的,都是對(duì)內(nèi)可見(jiàn),對(duì)外不可見(jiàn)。并且,都會(huì)附著在這個(gè)作用域上。并且,let 和const 不存在提升。
let 和const 不可重復(fù)聲明同一個(gè)標(biāo)識(shí)符。(具體的相關(guān)內(nèi)容參見(jiàn)ES6相關(guān)書籍)。
在看了幾本書之后的一些理解和自己的想法。以上的主要是參考你所不知道的JavaScript上。
歡迎各位前輩指正,謝謝。
http://www.cnblogs.com/senhaishusheng/p/7183393.html