国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

解析JavaScript模仿塊級作用域

2019-11-19 18:12:49
字體:
來源:轉載
供稿:網友

javaScript 沒有塊級作用域的概念。這意味著在塊語句中定義的變量,實際上是在包含函數中而非語句中創建的,來看下面的例子:

function outputNumbers(count){ for (var i=0; i < count; i++){ 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(){ //這里是塊級作用域})();

以上代碼定義并立即調用了一個匿名函數。將函數聲明包含在一對圓括號中,表示它實際上是一個函數表達式。而緊隨其后的另一對圓括號會立即調用這個函數。如果有讀者感覺這種語法不太好理解,可以再看看下面這個例子:

var count = 5;outputNumbers(count);

這里初始化了變量count,將其值設置為5。當然,這里的變量是沒有必要的,因為可以把值直接傳給函數。為了讓代碼更簡潔,我們在調用函數時用5 來代替變量count,如下所示:

outputNumbers(5);

這樣做之所以可行,是因為變量只不過是值的另一種表現形式,因此用實際的值替換變量沒有問題。

再看下面的例子:

var someFunction = function(){ //這里是塊級作用域};someFunction();

這個例子先定義了一個函數,然后立即調用了它。定義函數的方式是創建一個匿名函數,并把匿名函數賦值給變量someFunction。而調用函數的方式是在函數名稱后面添加一對圓括號,即someFunction()。通過前面的例子我們知道,可以使用實際的值來取代變量count,那在這里是不是也可以用函數的值直接取代函數名呢? 然而,下面的代碼卻會導致錯誤。

function(){ //這里是塊級作用域}(); //出錯!

這段代碼會導致語法錯誤,是因為JavaScript 將function 關鍵字當作一個函數聲明的開始,而函數聲明后面不能跟圓括號。然而,函數表達式的后面可以跟圓括號。要將函數聲明轉換成函數表達式,只要像下面這樣給它加上一對圓括號即可。

(function(){ //這里是塊級作用域})();

無論在什么地方,只要臨時需要一些變量,就可以使用私有作用域,例如:

function outputNumbers(count){ (function () {   for (var i=0; i < count; i++){   alert(i);  } })(); alert(i); //導致一個錯誤!}

在這個重寫后的outputNumbers()函數中,我們在for 循環外部插入了一個私有作用域。在匿名函數中定義的任何變量,都會在執行結束時被銷毀。因此,變量i 只能在循環中使用,使用后即被銷毀。

而在私有作用域中能夠訪問變量count,是因為這個匿名函數是一個閉包,它能夠訪問包含作用域中的所有變量。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洪雅县| 乡宁县| 循化| 普定县| 绥中县| 西盟| 桐梓县| 大方县| 龙口市| 奉贤区| 富顺县| 黑河市| 平武县| 临海市| 南漳县| 梅州市| 昌宁县| 南华县| 论坛| 巴彦淖尔市| 宝鸡市| 望都县| 通海县| 泰宁县| 拉萨市| 丰镇市| 上林县| 盐源县| 萝北县| 舟山市| 永和县| 乳源| 梓潼县| 衡东县| 沈丘县| 古丈县| 精河县| 怀仁县| 尤溪县| 无锡市| 兰西县|