JavaScript學習筆記(1)變數的生命週期
變數的生命週期又稱為作用域,是指某變數在程式中的有效範圍。根據作用域,變數可以分為全域變數和局部變數。
1、 全域變數的作用域是全域性的,即在整個javaScript程式中,全域變數處處都在。
2、 而在函數內部宣告的變量,只在函數內部作用。這些變數是局部變量,作用域是局部性的;函數的參數也是局部性的,只在函數內部起作用。
經常見到網路上有文章說:「在Javascript中可以有兩種方式宣告全域變數:1、宣告變數時不使用var關鍵字2、在函數外部宣告變數使用第一種方法宣告變數時,就算是在函數內部,該變數仍為全域變量,使用第二種方法宣告變數時,就算是用var關鍵字,那麼宣告的變數也是全域變量,」自己親手測試就知其中對錯:參考如下範例:
1
為什麼結果與大家公認的不一致呢,讓我們把程序做稍微的改動:
1
呵呵,這時候,程式終於按照我們原先的設想執行了,但是這個時候,我們就必須做下來好好總結一下了:
如果我們在函數內部聲明了一個全域變量,也就是聲明變數時未使用var關鍵字,當我們在其他地方使用該變數時,必須保證該函數已被呼叫,所以,如果真的要使用全域變數還是在函數外部宣告的好
還有一個值得注意的地方就是:JavaScript變量作用範圍沒有語句塊的概念,他並不像JAVA一樣在for循環內部聲明的變量,在for循環外部就不能使用,參看一下範例:
1 function test(){
2 為(var i =0 ; ent.write(i+"
");
4 if(i == 19) {
5 var j = "我是在for語句內部宣告的";
6 }
8 alert(j); //output: "我是在for語句內部宣告的"
9 ;
除此之外,還有一個容易造成錯誤的地方不能不說,請參考程序:
1 var strTest = "全域變數";
2 ); //output : "undefined"
4 var strTest = "看看出錯沒";
5 接著在函數內部把它alert出來,最後我們又聲明了一個同全局變量的名字相同的一個局部變量,但是就是這個只有六行的小程序,其結果卻並不像我們想像的那樣輸出"看看出錯沒",而是輸出了undefined,呵呵,看來「JavaScript真是處處是陷阱啊」!
在網上GOOGLE了半天,找到了這樣一種說法:
大家都知道JavaScript是一種解釋型的腳本語言,當JavaScript運行時,首先查找所有的變數聲明,並以未定義的初始值建立變數。如果變數被宣告時有值,那麼變數仍以未定義的值初始化,並且只有在執行了宣告行時才被宣告值取代。這也就解釋了以上的程序,其實如果我們在程序的第一行之前加上一句:alert(strTest);輸出結果依然會是undefined,看到這我想大家應該也想到了,程序出錯的原因並不是說聲明了一個與全域變量名稱相同的局部變量,而是只要在變量聲明語句之前調用該變量,該變量的值就一定是undefined,但是如果我們調用一個沒有被聲明的變量,這個時候會報「變數未定義」的錯誤,所以我們還必須得明白這兩者之間的區別,不過不管怎麼說,一種好的編碼習慣還是避免把局部變數與全域變數聲明稱相同的名字!
在看最後一種情況:注意以下程序:
1 var strGloblVar = "我是全域變數";
2 blVar = "在父函數中宣告的全域變數";
4 var strFatherVar = "我是父函數中為局部變量,同時也是子函數中的全域變數";
5 function child(){
6 7 var strChildVar = "我是子函數中的局部變數";
8 alert(strFatherVar); //output: "我為父函數中為局部變量,同時也是子函數中的全域變數" output: "我是子函數中的局部變數"
10 alert("子函數中:"+strGloblVar); //output: "我是全域變數"
12 }
13 alert("父函數中:"+strGloblVar); // output: "我是全域變數"
14 //alert(strChildVar); //error: strChildVar 未定義
15
16 return child();
17 }
18
19 father();
20 alert("所有函數外在:"+strFatherGloo) alert("所有函數的外在: "+strChildGloblVar); //output:"所有函數的外部:在子函數中聲明的全域變數" 用過JavaScript閉包的人會很容易的看懂以上程序,閉包不是本文要說明的重點,但是這個小例子可以幫我們證明在閉包的情況下,變數的生命週期並沒有因為使用閉包而有很大的改變,可以簡單的拋開閉包的概念,把father()函數內部看成一個獨立的運作環境。 14行報錯,是因為strChildVar是child()函數中定義的局部變量,15行報錯,是因為在調用strChildGloblVar之前child()函數未被執行過,這和我們之前說的都一樣。但是當我們在father()函數外部印出strFatherVar的時候會出現錯誤,導致這種錯誤的原因很簡單,strFatherVar雖然是child()的全域變量,但卻是father()的局部變數。
以上就是JavaScript學習筆記(1)變數的生命週期的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
