解析JavaScript模仿塊級(jí)作用域
javaScript 沒有塊級(jí)作用域的概念。這意味著在塊語句中定義的變量,實(shí)際上是在包含函數(shù)中而非語句中創(chuàng)建的,來看下面的例子:
function outputNumbers(count){ for (var i=0; i < count; i++){ alert(i); } alert(i); //計(jì)數(shù) }
這個(gè)函數(shù)中定義了一個(gè)for 循環(huán),而變量i 的初始值被設(shè)置為0。
在Java、C++等語言中,變量i
只會(huì)在for 循環(huán)的語句塊中有定義,循環(huán)一旦結(jié)束,變量i 就會(huì)被銷毀。可是在JavaScrip 中,變量i
是定義在ouputNumbers()的活動(dòng)對(duì)象中的,因此從它有定義開始,就可以在函數(shù)內(nèi)部隨處訪問它。即
使像下面這樣錯(cuò)誤地重新聲明同一個(gè)變量,也不會(huì)改變它的值。
function outputNumbers(count){ for (var i=0; i < count; i++){ alert(i); } var i; //重新聲明變量 alert(i); //計(jì)數(shù) }
JavaScript 從來不會(huì)告訴你是否多次聲明了同一個(gè)變量;遇到這種情況,它只會(huì)對(duì)后續(xù)的聲明視而不見(不過,它會(huì)執(zhí)行后續(xù)聲明中的變量初始化)。匿名函數(shù)可以用來模仿塊級(jí)作用域并避免這個(gè)問題。
用作塊級(jí)作用域(通常稱為私有作用域)的匿名函數(shù)的語法如下所示:
(function(){ //這里是塊級(jí)作用域 })();
以上代碼定義并立即調(diào)用了一個(gè)匿名函數(shù)。將函數(shù)聲明包含在一對(duì)圓括號(hào)中,表示它實(shí)際上是一個(gè)函數(shù)表達(dá)式。而緊隨其后的另一對(duì)圓括號(hào)會(huì)立即調(diào)用這個(gè)函數(shù)。如果有讀者感覺這種語法不太好理解,可以再看看下面這個(gè)例子:
var count = 5; outputNumbers(count);
這里初始化了變量count,將其值設(shè)置為5。當(dāng)然,這里的變量是沒有必要的,因?yàn)榭梢园阎抵苯觽鹘o函數(shù)。為了讓代碼更簡(jiǎn)潔,我們?cè)谡{(diào)用函數(shù)時(shí)用5 來代替變量count,如下所示:
outputNumbers(5);
這樣做之所以可行,是因?yàn)樽兞恐徊贿^是值的另一種表現(xiàn)形式,因此用實(shí)際的值替換變量沒有問題。
再看下面的例子:
var someFunction = function(){ //這里是塊級(jí)作用域 }; someFunction();
這個(gè)例子先定義了一個(gè)函數(shù),然后立即調(diào)用了它。定義函數(shù)的方式是創(chuàng)建一個(gè)匿名函數(shù),并把匿名函數(shù)賦值給變量someFunction。而調(diào)用函數(shù)的方式是在函數(shù)名稱后面添加一對(duì)圓括號(hào),即someFunction()。通過前面的例子我們知道,可以使用實(shí)際的值來取代變量count,那在這里是不是也可以用函數(shù)的值直接取代函數(shù)名呢? 然而,下面的代碼卻會(huì)導(dǎo)致錯(cuò)誤。
function(){ //這里是塊級(jí)作用域 }(); //出錯(cuò)!
這段代碼會(huì)導(dǎo)致語法錯(cuò)誤,是因?yàn)镴avaScript 將function 關(guān)鍵字當(dāng)作一個(gè)函數(shù)聲明的開始,而函數(shù)聲明后面不能跟圓括號(hào)。然而,函數(shù)表達(dá)式的后面可以跟圓括號(hào)。要將函數(shù)聲明轉(zhuǎn)換成函數(shù)表達(dá)式,只要像下面這樣給它加上一對(duì)圓括號(hào)即可。
(function(){ //這里是塊級(jí)作用域 })();
無論在什么地方,只要臨時(shí)需要一些變量,就可以使用私有作用域,例如:
function outputNumbers(count){ (function () { for (var i=0; i < count; i++){ alert(i); } })(); alert(i); //導(dǎo)致一個(gè)錯(cuò)誤! }
在這個(gè)重寫后的outputNumbers()函數(shù)中,我們?cè)趂or 循環(huán)外部插入了一個(gè)私有作用域。在匿名函數(shù)中定義的任何變量,都會(huì)在執(zhí)行結(jié)束時(shí)被銷毀。因此,變量i 只能在循環(huán)中使用,使用后即被銷毀。
而在私有作用域中能夠訪問變量count,是因?yàn)檫@個(gè)匿名函數(shù)是一個(gè)閉包,它能夠訪問包含作用域中的所有變量。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- 深入理解JavaScript中的塊級(jí)作用域、私有變量與模塊模式
- JavaScript的作用域和塊級(jí)作用域概念理解
- 為什么JavaScript沒有塊級(jí)作用域
- Javascript中的作用域及塊級(jí)作用域
- JavaScript匿名函數(shù)之模仿塊級(jí)作用域
- 通過函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈
- JavaScript使用閉包模仿塊級(jí)作用域操作示例
- js類中的公有變量和私有變量
- javascript 動(dòng)態(tài)生成私有變量訪問器
- JavaScript私有變量實(shí)例詳解
- JS塊級(jí)作用域和私有變量實(shí)例分析
相關(guān)文章
JS實(shí)戰(zhàn)例子之實(shí)現(xiàn)自動(dòng)打字機(jī)動(dòng)效
什么是打字機(jī)效果呢?打字機(jī)效果即為文字逐個(gè)輸出,實(shí)際上就是一種Web動(dòng)畫,下面這篇文章主要給大家介紹了關(guān)于JS實(shí)戰(zhàn)例子之實(shí)現(xiàn)自動(dòng)打字機(jī)動(dòng)效的相關(guān)資料,需要的朋友可以參考下2023-01-01淺析微信小程序modal彈窗關(guān)閉默認(rèn)會(huì)執(zhí)行cancel問題
這篇文章主要介紹了小程序modal彈窗關(guān)閉默認(rèn)會(huì)執(zhí)行cancel方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10一個(gè)簡(jiǎn)單的JS鼠標(biāo)懸停特效具體方法
這個(gè)特效最終實(shí)現(xiàn)效果就是當(dāng)鼠標(biāo)移動(dòng)到鏈接上,文字會(huì)橫向移動(dòng)一定距離,貌似總有人喜歡這些花花草草。添加此效果方法很簡(jiǎn)單。2013-06-06javascript 容錯(cuò)處理代碼(屏蔽js錯(cuò)誤)
有時(shí)候大家來瀏覽網(wǎng)頁的時(shí)候發(fā)現(xiàn)IE瀏覽器左下角總有個(gè)黃色錯(cuò)誤標(biāo)志,有時(shí)候更是直接彈出錯(cuò)誤無法繼續(xù)瀏覽頁面,這樣對(duì)于網(wǎng)站的正規(guī)性與權(quán)威性發(fā)展不利。2010-04-04