JavaScript學(xué)習(xí)之旅-7(原創(chuàng))

在上一篇文章中,我們主要學(xué)習(xí)在JavaScript中邓嘹,如何定義函數(shù)(也稱方法)辕漂,使用函數(shù),如何使用arguments去規(guī)避傳參的風(fēng)險(xiǎn)吴超。這一篇文章我們主要學(xué)習(xí)在JavaScript中變量的作用域與解構(gòu)賦值。

概念一:在JavaScript中鸯乃,用var申明的變量實(shí)際上是有作用域的鲸阻。

我們首先來復(fù)習(xí)下在Java中成員變量和局部變量是如何定義和使用的。

成員變量:

在類里面定義的變量叫做成員變量缨睡;

如果在變量有static關(guān)鍵字修飾鸟悴,就叫作靜態(tài)變量或類變量;

如果該變量沒有static關(guān)鍵字修飾奖年,就叫作非靜態(tài)變量或?qū)嵗兞浚?/p>

局部變量:

方法內(nèi)定義的變量细诸、形參、代碼塊中定義的變量都叫做局部變量陋守;

另外震贵,成員變量可以不顯式初始化,它們可以由系統(tǒng)設(shè)定默認(rèn)值水评;

但是局部變量沒有默認(rèn)值猩系,在使用前必須賦值才可以使用。

還有中燥,在內(nèi)存中的位置也不一樣寇甸。

成員變量在所在類被實(shí)例化后,存在堆內(nèi)存中疗涉;局部變量在所在方法調(diào)用時(shí)拿霉,存在棧內(nèi)存空間中。

復(fù)習(xí)完了Java咱扣,那么首先討論變量的作用域的第一個(gè)話題绽淘,在JavaScript中,變量的全局作用域是什么偏窝?

首先收恢,不在任何函數(shù)內(nèi)定義的變量武学,就具有全局作用域。如下圖


全局變量


實(shí)際上伦意,JavaScript默認(rèn)有一個(gè)全局對象window火窒,全局作用域的變量實(shí)際上被綁定到window的一個(gè)屬性,既然是綁定在window中驮肉,我們就可以直接使用熏矿,如下圖


window全局使用變量

我們在學(xué)習(xí)函數(shù)的基礎(chǔ)的時(shí)候說道每一個(gè)function有兩種表達(dá)形式:一種是純粹的function,還有一種是function就可以代表一個(gè)var變量离钝,因此票编,每一個(gè)具體的函數(shù)如果用var變量來表示的話,這也是一個(gè)全局變量

直接使用方法

綜上:使用window對象卵渴,也可以直接調(diào)用上面的test方法慧域,實(shí)踐檢測:


window對象調(diào)用

結(jié)論:根據(jù)上面的例子,我們可以判斷JavaScript實(shí)際上有一個(gè)全局作用域浪读。任何變量(函數(shù)也視為變量)昔榴,如果沒有在當(dāng)前函數(shù)作用域中找到,就會(huì)繼續(xù)往上查找碘橘,最后如果在全局作用域中也沒有找到互订,則報(bào)ReferenceError錯(cuò)誤(也就是類似我們java的空指針)。

老司機(jī)可能會(huì)說痘拆,上面說到了仰禽,全局變量會(huì)綁定到window上。如果不同的JavaScript文件如果使用了相同的全局變量纺蛆,或者定義了相同名字的頂層函數(shù)吐葵,這種情況該怎么處理?

解決辦法:減少命名沖突的一個(gè)有效方法是把 自己的所有變量和函數(shù)全部綁定到一個(gè)全局變量中犹撒。


我們可以把自己的代碼放入到自己唯一INFO中(根據(jù)自己的需求去定義即可)折联,這樣會(huì)大大減少全局變量沖突的可能,而且會(huì)顯著提高代碼的閱讀性和質(zhì)量识颊。

說完了JavaScript變量的全局作用域诚镰,那么局部作用域是什么?

由于JavaScript的變量作用域?qū)嶋H上是在函數(shù)內(nèi)部祥款,但是我們在for循環(huán)等語句中是無法定義具有局部作用域的變量的清笨。為了解決塊級(jí)作用域,ES6引入了新的關(guān)鍵字let刃跛,用let關(guān)鍵字替代var可以申明一個(gè)塊級(jí)作用域的變量抠艾。

常量:

在JavaScript中,聲明常量的方式有兩種桨昙,第一種是在全局變量中使用检号,變量名全部大寫腌歉,這一種是通過書寫規(guī)范去表示這是一個(gè)常量,不要修改它的值齐苛;但是在?ES6 標(biāo)準(zhǔn)中翘盖,引入了新的關(guān)鍵字 const 去定義常量,這里就不演示了凹蜂。(簡單理解就是Java中的final關(guān)鍵字)

關(guān)于var申明的變量實(shí)際上是有作用域的必須記住的一些概念:

A:如果一個(gè)變量在函數(shù)(方法)體內(nèi)部申明馍驯,則該變量的作用域?yàn)檎麄€(gè)函數(shù)體,在函數(shù)外不可引用該變量玛痊。

無法在函數(shù)體外引用變量a

B:如果兩個(gè)不同的函數(shù)各自申明了同一個(gè)變量汰瘫,那么該變量只在各自的函數(shù)體內(nèi)起作用。(只能用在自己的方法內(nèi))


不同函數(shù)申明同名變量不影響 ?

C:JavaScript的函數(shù)可以嵌套擂煞,此時(shí)混弥,內(nèi)部函數(shù)可以訪問外部函數(shù)定義的變量,反過來則不行


內(nèi)外部變量的限制規(guī)則

D:如果內(nèi)部函數(shù)和外部函數(shù)的變量名重名怎么辦对省?那么剑逃,內(nèi)部函數(shù)的變量將“屏蔽”外部函數(shù)的變量。

拓展:變量提升


變量提升

JavaScript的方法定義有個(gè)特點(diǎn)官辽,它首先會(huì)先掃描整個(gè)函數(shù)體的語句,把所有申明的變量“提升”到函數(shù)頂部粟瞬,第三行的 var x = 'Hello, ' + y ; ?這一行并沒有報(bào)錯(cuò)同仆,原因是變量y在稍后申明了。但是console.log 顯示 Hello, undefined裙品,說明變量 y 的值為undefined俗批。這正是因?yàn)镴avaScript引擎自動(dòng)提升了變量y的聲明,但不會(huì)提升變量y的賦值市怎。因此我們在方法內(nèi)部定義變量時(shí)岁忘,請嚴(yán)格遵守“在方法內(nèi)部首先申明所有變量,然后在使用”這一開發(fā)原則区匠。

說完了JavaScript中變量的作用域干像,接下來我們在談?wù)劷鈽?gòu)賦值。

解構(gòu)賦值:

什么是解構(gòu)賦值驰弄?

解構(gòu)賦值?就是可以同時(shí)對一組變量進(jìn)行賦值麻汰。從ES6開始,JavaScript引入了這一新特性戚篙,它大大提高了開發(fā)效率五鲫。它為什么會(huì)提高開發(fā)效率,我們先從數(shù)組說起岔擂。

首先位喂,如何把一個(gè)數(shù)組的元素分別賦值給幾個(gè)變量浪耘?有人說,簡單塑崖,洋洋灑灑就是以下代碼

數(shù)組元素賦值變量

嗯七冲,上面的方式的確做到了,輕松無痛苦弃舒。但是使用了新特性解構(gòu)賦值的話癞埠,先看圖

解構(gòu)賦值 - 1?

使用了解構(gòu)賦值就只有兩行代碼 即可完成上面的事情(x, y, z分別被賦值為數(shù)組對應(yīng)元素)。

需要注意的有以下幾點(diǎn):

A:對數(shù)組元素進(jìn)行解構(gòu)賦值時(shí)聋呢,多個(gè)變量要用[ ... ]括起來

B:如果數(shù)組本身還有嵌套苗踪,也可以通過下面的形式進(jìn)行解構(gòu)賦值。(注意嵌套層次和位置要保持一致)


解構(gòu)賦值 - 2 ??

C:解構(gòu)賦值還可以忽略某些元素


解構(gòu)賦值 - 3

注意削锰,這里的 ?z 成功打印出了數(shù)值通铲,但是 x y 都拋出了異常,所以我們還是需要嚴(yán)格遵循代碼規(guī)范去編寫代碼

D:如果需要從一個(gè)對象中取出若干屬性器贩,也可以使用解構(gòu)賦值颅夺,便于快速獲取對象的指定屬性:


解構(gòu)賦值 - 4

從圖中我們清楚的可以看到,我們成功的將 person對象的 name蛹稍、age吧黄、passport全部成功的打印出來了。

E:對一個(gè)對象進(jìn)行解構(gòu)賦值時(shí)唆姐,同樣可以直接對嵌套的對象屬性進(jìn)行賦值拗慨,但需要保證對應(yīng)層次一致即可。?如下圖

解構(gòu)賦值 - 5

F:使用解構(gòu)賦值對對象屬性進(jìn)行賦值時(shí)奉芦,如果對應(yīng)的屬性不存在赵抢,變量將被賦值為undefined。

G:解構(gòu)賦值還可以使用默認(rèn)值声功,這樣就避免了不存在的屬性返回undefined的問題烦却,如下圖

解構(gòu)賦值 - 6

這里沒有在person對象中聲明single字段,但是我們可以直接在解構(gòu)賦值里面使用默認(rèn)值先巴。

H:有些時(shí)候其爵,如果變量已經(jīng)被聲明了,再次賦值的時(shí)候伸蚯,正確的寫法也會(huì)報(bào)語法錯(cuò)誤醋闭,如下圖


解構(gòu)賦值 - 7

解決辦法1:不單獨(dú)聲明 var變量 x,y,兩行合并成一行

解決辦法2:使用括號(hào)朝卒,如下圖(推薦用法):

解構(gòu)賦值的格式問題

目前支持解構(gòu)賦值的瀏覽器包括Chrome证逻,F(xiàn)irefox,Edge等。

本篇文章學(xué)習(xí)的是關(guān)于變量的作用域與解構(gòu)賦值囚企,篇幅較長內(nèi)容也很多丈咐,需要自己耗時(shí)間多消化,變量的作用域與解構(gòu)賦值的基本內(nèi)容就結(jié)束了龙宏。

未完待續(xù)棵逊。。银酗。

如果這篇文章對您有開發(fā)or學(xué)習(xí)上的些許幫助辆影,希望各位看官留下寶貴的star,謝謝黍特。

Ps:著作權(quán)歸作者所有,轉(zhuǎn)載請注明作者, 商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)蛙讥,非商業(yè)轉(zhuǎn)載請注明出處(開頭或結(jié)尾請?zhí)砑愚D(zhuǎn)載出處,添加原文url地址),文章請勿濫用,也希望大家尊重筆者的勞動(dòng)成果灭衷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末次慢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子翔曲,更是在濱河造成了極大的恐慌迫像,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞳遍,死亡現(xiàn)場離奇詭異闻妓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掠械,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門纷闺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人份蝴,你說我怎么就攤上這事∶ズ洌” “怎么了婚夫?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長署鸡。 經(jīng)常有香客問我案糙,道長,這世上最難降的妖魔是什么靴庆? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任时捌,我火速辦了婚禮,結(jié)果婚禮上炉抒,老公的妹妹穿的比我還像新娘奢讨。我一直安慰自己,他們只是感情好焰薄,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布拿诸。 她就那樣靜靜地躺著扒袖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亩码。 梳的紋絲不亂的頭發(fā)上季率,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音描沟,去河邊找鬼飒泻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吏廉,可吹牛的內(nèi)容都是我干的泞遗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼迟蜜,長吁一口氣:“原來是場噩夢啊……” “哼刹孔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娜睛,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤髓霞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畦戒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方库,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年障斋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵潦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垃环,死狀恐怖邀层,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遂庄,我是刑警寧澤寥院,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站涛目,受9級(jí)特大地震影響秸谢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霹肝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一估蹄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沫换,春花似錦臭蚁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炭晒。三九已至,卻和暖如春甥角,著一層夾襖步出監(jiān)牢的瞬間网严,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工嗤无, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留震束,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓当犯,卻偏偏與公主長得像垢村,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子嚎卫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)嘉栓,也就是一...
    悟名先生閱讀 4,151評論 0 13
  • hello world “hello world” 這是碼農(nóng)的第一句代碼, 而我視為你出生后的第一句話拓诸。 萌芽 外...
    卡爾劉閱讀 582評論 0 0
  • 去年我請了年假侵佃,跟朋友一起去了陜西。我們最先去的是回民街奠支。里面的人特別多馋辈,都是奔著吃去的。好幾個(gè)攤位特別火倍谜,在攤位...
    龍貓家的貓閱讀 457評論 1 3
  • 人生如戲尔崔,劇本里早就寫好你不會(huì)是我戲里的男主角答毫,你只負(fù)責(zé)扮演我人生路上的甲乙丙丁。但依然感謝你曾經(jīng)友情出演...
    飄雪之夢H閱讀 1,256評論 24 9
  • 月下操琴季春, 美人袖里纖纖手洗搂; 玉尖靈動(dòng), 隔岸弦清又鹤盒。 竹影隨風(fēng), 把鏡湖吹皺侦副; 更聲漏侦锯, 幾絲煙柳, 共半樽殘酒...
    清凈菩提閱讀 335評論 0 0