javascript
JavaScript模仿块级作用域
avaScript 沒有塊級作用域的概念。這意味著在塊語句中定義的變量,實際上是在包含
函數中而非語句中創建的,來看下面的例子:
????alert(i);
????}
????alert(i);?//計數}
這個函數中定義了一個for 循環,而變量i 的初始值被設置為0。
在Java、C++等語言中,變量i
只會在for 循環的語句塊中有定義,循環一旦結束,變量i 就會被銷毀。可是在JavaScrip 中,變量i
是定義在ouputNumbers()的活動對象中的,因此從它有定義開始,就可以在函數內部隨處訪問它。即
使像下面這樣錯誤地重新聲明同一個變量,也不會改變它的值。
function?outputNumbers(count){????????for?(var?i=0;?i?<?count;?i++){
????????alert(i);
????}????var?i;?//重新聲明變量
????alert(i);?//計數}
JavaScript 從來不會告訴你是否多次聲明了同一個變量;遇到這種情況,它只會對后續的聲明視而不
見(不過,它會執行后續聲明中的變量初始化)。匿名函數可以用來模仿塊級作用域并避免這個問題。
用作塊級作用域(通常稱為私有作用域)的匿名函數的語法如下所示:
(function(){????//這里是塊級作用域})();以上代碼定義并立即調用了一個匿名函數。將函數聲明包含在一對圓括號中,表示它實際上是一個
函數表達式。而緊隨其后的另一對圓括號會立即調用這個函數。如果有讀者感覺這種語法不太好理解,
可以再看看下面這個例子:
outputNumbers(count);
這里初始化了變量count,將其值設置為5。當然,這里的變量是沒有必要的,因為可以把值直接
傳給函數。為了讓代碼更簡潔,我們在調用函數時用5 來代替變量count,如下所示:
這樣做之所以可行,是因為變量只不過是值的另一種表現形式,因此用實際的值替換變量沒有問題。
再看下面的例子:
someFunction();
這個例子先定義了一個函數,然后立即調用了它。新航道雅思定義函數的方式是創建一個匿名函數,并把匿名
函數賦值給變量someFunction。而調用函數的方式是在函數名稱后面添加一對圓括號,即
someFunction()。通過前面的例子我們知道,可以使用實際的值來取代變量count,那在這里是不是
也可以用函數的值直接取代函數名呢? 然而,下面的代碼卻會導致錯誤。
這段代碼會導致語法錯誤,是因為JavaScript 將function 關鍵字當作一個函數聲明的開始,而函
數聲明后面不能跟圓括號。然而,函數表達式的后面可以跟圓括號。要將函數聲明轉換成函數表達式,
只要像下面這樣給它加上一對圓括號即可。
無論在什么地方,只要臨時需要一些變量,就可以使用私有作用域,例如:
function?outputNumbers(count){
????(function?()?{????????????for?(var?i=0;?i?<?count;?i++){
????????????alert(i);
????????}
????})();
????alert(i);?//導致一個錯誤!}
在這個重寫后的outputNumbers()函數中,我們在for 循環外部插入了一個私有作用域。在匿名
函數中定義的任何變量,都會在執行結束時被銷毀。因此,變量i 只能在循環中使用,使用后即被銷毀。
而在私有作用域中能夠訪問變量count,是因為這個匿名函數是一個閉包,它能夠訪問包含作用域中的
所有變量。
轉載于:https://blog.51cto.com/zhangtaoze/1917111
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的JavaScript模仿块级作用域的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你爱烹饪吗?研究称做饭可降低四成死亡率
- 下一篇: 索尼 Xperia 5 V 跑分曝光,搭