天天看點

javascrip變量和辨別符0x010x02:定義0x02:命名規則0x04:變量聲明0x05:變量特性0x06:變量作用域

  關于javascript,第一個比較重要的概念是變量,變量的工作機制是javascript的基本特性。實際上,變量是辨別符的一種。本文将詳細介紹變量和辨別符

  辨別符(Identifier)就是一個名字,用來對變量、函數、屬性、參數進行命名,或者用做某些循環語句中的跳轉位置的标記

  在日常生活中,有些東西是固定不變的,有些東西則會發生變化。例如,人的姓名和生日是固定不變的,但心情和年齡卻會随着時間變化而變化。人們把那些會發生變化的東西稱為變量

  當程式需要将值儲存起來以備将來使用時,便将其指派給一個變量。變量(variable)是一個用于儲存值的占位符,可以通過變量名稱來獲得對值的引用。

javascrip變量和辨別符0x010x02:定義0x02:命名規則0x04:變量聲明0x05:變量特性0x06:變量作用域

  在詞法結構一文中,我們介紹到javascript是一門區分字母大小寫的語言,且和其他任何程式設計語言一樣,javascript保留了一些辨別符為自己所用,保留字不能用做普通的辨別符

  [注意]保留字包括關鍵字、未來保留字、空字面量和布爾值字面量

  此外,javascript預定義了很多全局變量和函數,應該避免把它們的名字用做辨別符名

  javascript辨別符名允許包含字母、數字、美元符号和下劃線(但第一個字元不允許是數字)

  javascript允許辨別符中出現 Unicode字元全集中的字母和數字(包括中文)。是以,程式員也可以使用非英語語言或數學符号來書寫辨別符

<code>var 測試文字 = 'test';</code>

[注意]出于可移植性和易于書寫的考慮,通常我們不使用擴充的ASCII或Unicode字元

通常駝峰格式是辨別符命名的首選格式,第一個字母小寫,剩下的每個單詞的首字母大寫

<code>var myMoodToday = 'happy';</code>

對于不同的資料類型,javascript有約定俗成的辨別符名命名規則

上面這種命名方法,叫匈牙利命名法。現在目前主流的程式設計規範都不推薦這種命名法

  一般來說,變量的命名要使用名詞,而函數應該是動詞+名稱的形式

對于變量命名來說,盡量要在變量名中展現出值的資料類型

  比如,命名count、length和size表明資料類型是數字,而命名name、title和message表明資料類型是字元串。用單個字元命名的變量諸如i、j、k通常在循環中使用

  而對于函數和方法命名來說,第一個單詞應該是動詞,下面是一些使用動詞常見的約定

聲明

  在javascript中,使用一個變量之前應當先聲明(declare),變量是使用關鍵字var(variable的縮寫)來聲明的

  也可以通過一個var關鍵字來聲明多個變量

<code>var i ,sum;</code>

指派

  把值存入變量的操作稱為指派(assignment)。一個變量被指派以後,我們就說該變量包含這個值

  給變量第一次指派的過程,叫初始化

  我們可以将變量的初始指派和變量聲明合寫在一起

  如果未在var聲明語句中給變量指定初始值,那麼雖然聲明了這個變量,但在給它存入一個值之前,它的初始值就是undefined

  在for循環和for-in循環中同樣可以使用var語句,這樣可以更簡潔地聲明在循環文法内中使用的循環變量

重複聲明

  使用var語句重複聲明變量是合法且無害的,如果重複聲明且帶有指派操作,相當于重新指派

遺漏聲明

  如果試圖讀取一個沒有聲明的變量的值,javascript會報錯

  javascript允許遺漏聲明,即直接對變量指派而無需事先聲明,指派操作将自動聲明該變量

  但是,在ECMAScript5嚴格模式中,給一個沒有聲明的變量指派會報錯

  javascript變量是弱類型(也叫松散類型)的,所謂松散類型就是可以用來儲存任何類型的資料

  程式設計語言分為動态類型語言和靜态類型語言兩種。 動态類型語言是指在運作期間才去做資料類型檢查的語言,也就是說,在用動态類型的語言程式設計時,不用給任何變量指定資料類型,該語言會在第一次指派給變量時,在内部将資料類型記錄下來。javascript就是動态類型語言的代表

  在javascript中,可以在修改變量值的同時修改值的類型

  變量松散類型的特性總結起來有兩點:一是聲明時不用給變量指定資料類型;二是指派時可以修改資料類型

  變量的作用域(scope)是程式源代碼中定義這個變量的區域

  作用域分為全局作用域和函數作用域(又叫局部作用域)兩種

  全局作用域是最外圍的一個執行環境,在web浏覽器中,全局執行環境被認為是window對象。所有全局變量和函數都是作為window對象的屬性和方法建立的。全局變量擁有全局作用域,在javascript代碼中的任何地方都是有定義的。全局作用域直到應用程式退出例如關閉網頁或浏覽器時才會被銷毀

  在函數内聲明的變量隻在函數體内有定義。它們是局部變量,作用域是局部性的。函數參數也是局部變量,它們隻在函數體内有定義。函數作用域中的所有代碼執行完畢後,該作用域被銷毀,儲存在其中的所有變量和函數定義也随之銷毀

  雖然省略var操作符可以定義全局變量,但并不推薦。在局部作用域中定義的全局變量很難維護,而且如果有意地忽略了var操作符,也會由于相應變量不會馬上就有定義而導緻不必要的混亂,給未經聲明的變量指派在嚴格模式下會導緻抛出ReferenceError錯誤

  在函數體内,局部變量的優先級高于同名的全局變量,如果在函數内聲明的一個局部變量或者函數參數中帶有的變量和全局變量重名,那麼全局變量就被局部變量遮蓋

聲明提升(hoisting)

塊級作用域

  塊級作用域是指花括号内的每一段代碼都具有各自的作用域,而javascript沒有塊級作用域。javascript隻有函數作用域:變量在聲明它們的函數體以及這個函數體嵌套的任意函數體内都是有定義的

  這意味着,變量在聲明之前甚至已經可用。javascript這個特性被非正式地稱為聲明提升(hoisting),javascript函數裡聲明的所有變量(不涉及指派)都被提前到函數體的頂部

  [注意]其實除了變量提升,函數也被提升,到函數部分會有詳細介紹

  javascript中沒有塊級作用域,是以一些程式員特意将變量聲明放在函數體頂部,這種源代碼非常清晰地反映了真實的變量作用域

屬性變量

當聲明一個javascript全局變量時,實際上是定義了全局對象window的一個屬性

  當使用var聲明一個變量時,建立的這個變量是不可配置的,也就是說這個變量無法通過delete運算符删除

  如果沒有使用嚴格模式并給一個未聲明的變量指派的話,javascript會自動建立一個全局變量,以這種方式建立的變量是全局對象的正常的可配置屬性,并可以删除它們

  [注意]IE8-浏覽器下,如果删除window屬性時,不論該屬性是如何建立的,都會報錯

  javascript全局變量是全局對象的屬性,這是在ECMAScript中強制規定的。局部變量當做跟函數調用相關的某個對象的屬性。ECMAScript3稱為調用對象(call object),ECMAScript5稱為聲明上下文對象(declarative environment record)。javascript允許使用this關鍵字來引用全局對象,卻沒有辦法可以引用局部變量中存放的對象。這種存放局部變量對象的特有性質,是一種對我們不可見的内部實作

參考資料

【4】《javascript權威指南(第6版)》第3章 類型、值和變量

【5】《javascript進階程式設計(第3版)》第3章 基本概念 第4章 變量、作用域和記憶體問題

【6】《javascript語言精粹(修訂版)》第2章 文法

【7】《javascript DOM程式設計藝術(第2版)》第2章 Javascript文法

本文轉自 wt7315 51CTO部落格,原文連結:http://blog.51cto.com/wt7315/2061684

繼續閱讀