2020-12-06

函數(shù)作用域及變量提升(作用域鏈)


關(guān)于函數(shù)的相關(guān)初識(shí)嘹履,函數(shù)在Js中是不可或缺的一部分,功能十分強(qiáng)大债热,所用到的地方呢也非常多砾嫉,提到函數(shù),函數(shù)的知識(shí)點(diǎn)很多窒篱。定義一個(gè)函數(shù)焕刮,需要function? 函數(shù)名 (參數(shù)){函數(shù)體}。函數(shù)需要調(diào)用才能使用墙杯,創(chuàng)建函數(shù)名的時(shí)候命名規(guī)則與變量的命名一樣配并。不能重復(fù)命名,重復(fù)命名最終只會(huì)生效一個(gè)高镐,后寫的會(huì)將先寫的覆蓋掉荐绝。其中,又要提到作用域的概念避消,什么是作用域。在函數(shù)內(nèi)部的稱為局部變量召夹,在函數(shù)外部的稱為全局變量岩喷。在js中,有個(gè)概念叫做作用域鏈监憎,總結(jié)來說纱意,就是從函數(shù)內(nèi)部向外部尋找的一個(gè)過程,形成一個(gè)作用域鏈鲸阔。變量提升:在js中偷霉,運(yùn)行時(shí)先將文檔中的變量和函數(shù)都預(yù)覽一遍,然后在按照從上往下的順序運(yùn)行代碼褐筛,此過程稱為變量提升类少。

作用域:

<!DOCTYPE html>

<head>

<title>Document</title>

</head>

<body>

<script>

? ? ? ? // 作用域及作用域鏈

? ? ? ? // 作用域:變量或函數(shù)的有效使用范圍,有全局作用域和局部作用域兩種

? ? ? ? // 全局變量: 函數(shù)外聲明的變量渔扎,在任何地方都可以被修改和訪問硫狞。

? ? ? ? // 局部變量:? 函數(shù)內(nèi)聲明的變量,只能在函數(shù)內(nèi)被修改和訪問。

? ? ? ? // 作用域鏈:是js內(nèi)部中的一種變量残吩,函數(shù)查找機(jī)制财忽,它決定了變量和函數(shù)的作用范圍,向上查找的方式

? ? ? ? // 全局函數(shù)

? ? ? ? function fn() {

? ? ? ? ? ? var b = 10//局部變量

? ? ? ? ? ? console.log('111');

? ? ? ? }

? ? ? ? //全局變量

? ? ? ? var a = 10

? ? ? ? console.log(window.a);

? ? ? ? window.fn()

? ? ? ? //? 在window上的屬性和函數(shù)可以省略window

? ? ? ? // var a=20

? ? ? ? // function fn() {

? ? ? ? //? ? var b = 10//局部變量

? ? ? ? //? ? console.log(a); //20

? ? ? ? //? ? console.log(b); //10

? ? ? ? // }

? ? ? ? // fn()

? ? ? ? // console.log(b);//報(bào)錯(cuò)? 局部變量b只在函數(shù)內(nèi)有效 出了函數(shù)就會(huì)被垃圾回收機(jī)制回收

? ? ? ? // 作用域鏈:是js內(nèi)部中的一種變量泣侮,函數(shù)查找機(jī)制即彪,它決定了變量和函數(shù)的作用范圍,向上查找的方式

? ? ? ? // var a=20

? ? ? ? // function fn() {

? ? ? ? //? ? var b = 10//局部變量

? ? ? ? //? ? // 變量a在函數(shù)內(nèi)作用域中沒有活尊,就會(huì)向上查找

? ? ? ? //? ? console.log(a); //20

? ? ? ? //? ? console.log(b); //10

? ? ? ? // }

? ? ? ? // fn()

? ? ? ? var? a=50

? ? ? ? function ff(){

? ? ? ? ? ? var b=10

? ? ? ? ? ? console.log(a); // 50 向上查找的機(jī)制

? ? ? ? ? ? gg()

? ? ? ? ? ? function gg(){

? ? ? ? ? ? ? ? var c=90 //gg函數(shù)的局部變量

? ? ? ? ? ? ? ? console.log(a); //向上查找的機(jī)制

? ? ? ? ? ? ? ? console.log('111');

? ? ? ? ? ? ? ? console.log(c); //在本身的局部作用域中就有


? ? ? ? ? ? }

? ? ? ? ? ? // gg()

? ? ? ? ? ? // console.log(c) //報(bào)錯(cuò)

? ? ? ? }

? ? ? ? ff()

? ? ? ? // gg() //報(bào)錯(cuò)? 局部函數(shù)

? ? ? ? function sum(){

? ? ? ? ? ? var a=10

? ? ? ? ? ? console.log(a); //10

? ? ? ? ? ? // console.log(c);//報(bào)錯(cuò)

? ? ? ? ? ? function s(){

? ? ? ? ? ? ? ? var c=20

? ? ? ? ? ? }

? ? ? ? ? ? s()

? ? ? ? }

? ? ? ? sum()

? ? ? ? console.log(c); //報(bào)錯(cuò)


</script>

</body>

</html>



變量提升:

<!DOCTYPE html>

<head>

<title>Document</title>

</head>

<body>

<script>

? ? ? ? // 變量提升:瀏覽器在解析js代碼的時(shí)候隶校,會(huì)先進(jìn)行一個(gè)預(yù)解析的操作,會(huì)有一個(gè)js解析器

? ? ? ? // js解析器酬凳,會(huì)執(zhí)行其中的兩個(gè)步驟

? ? ? ? // 1惠况、找 var? function (找變量)

? ? ? ? // 2、逐行解析

? ? ? ? // 1宁仔、找 var? function (找變量)

? ? ? ? // 1稠屠、1? 如果存在var 關(guān)鍵詞,則會(huì)將這個(gè)變量 存起來? 形式:var a; 并且提到最前面

? ? ? ? // 1.2 找函數(shù)? 如果存在函數(shù)則整體(不包含函數(shù)的調(diào)用)提到前面

? ? ? ? // 1.3 逐行排列解析

? ? ? ? // 函數(shù)調(diào)用的時(shí)候 翎苫,在函數(shù)內(nèi)部也會(huì)執(zhí)行以上兩個(gè)步驟

? ? ? ? // var b;

? ? ? ? // function s(){

? ? ? ? //? ? console.log('111');

? ? ? ? // }

? ? ? ? // console.log(b); //undefined

? ? ? ? // b = 10?

? ? ? ? // s()

? ? ? ? // console.log(c);

? ? ? ? // var c = 10

? ? ? ? // function s() {

? ? ? ? //? ? console.log(c);

? ? ? ? //? ? console.log(g);

? ? ? ? //? ? var g = 20

? ? ? ? // }

? ? ? ? // s()

? ? ? ? // console.log(c);

? ? ? ? // console.log(g);


? ? ? ? /*

? ? ? ? var c;

? ? ? ? function s(){? ? ? ? ? ? ?

? ? ? ? ? ? console.log(c);? ? ? ? ? ? var g;

? ? ? ? ? ? console.log(g);? ? ? ? ? ? console.log(c); //10

? ? ? ? ? ? var g=20? ? ? ? ? ? ? ? ? ? console.log(g);? //undefined

? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? g=20?

? ? ? ? ? console.log(c);//undefined

? ? ? ? ? c=10

? ? ? ? ? ? s()

? ? ? ? ? ? console.log(c); //10

? ? ? ? ? console.log(g); //局部變量不能再外面訪問

? ? ? ? */

? ? ? ? var? a=30

? ? ? ? var c;

? ? ? ? function s(){

? ? ? ? ? ? console.log(c); //undefined? ? ? ?

? ? ? ? ? ? c=50?

? ? ? ? ? ? console.log(a); // 30

? ? ? ? ? ? var k=80

? ? ? ? ? ? function gg(){

? ? ? ? ? ? ? ? console.log(k); //80

? ? ? ? ? ? }

? ? ? ? ? ? gg()? ? ? ? ? ?

? ? ? ? }

? ? ? ? console.log(c);//undefined

? ? ? ? s()

? ? ? ? console.log(c);//50



? ? ? ? /*

? ? ? ? ? var a;

? ? ? ? ? var c;

? ? ? ? ? function s(){? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? console.log(c);

? ? ? ? ? ? c=50

? ? ? ? ? ? console.log(a);

? ? ? ? ? ? var? k=80

? ? ? ? ? ? function gg(){

? ? ? ? ? ? ? ? console.log(k);

? ? ? ? ? ? }? ? ? ? ? ?

? ? ? ? }

? ? ? ? a=30

? ? ? ? console.log(c);

? ? ? ? s()



? ? ? ? ? var k;

? ? ? ? ? function gg(){

? ? ? ? ? ? ? ? console.log(k);

? ? ? ? ? ? }

? ? ? ? console.log(c);

? ? ? ? c=50

? ? ? ? console.log(a);

? ? ? ? k=80

? ? ? ? ? gg()

? ? ? ?*/

</script>

</body>

</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权埠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子煎谍,更是在濱河造成了極大的恐慌攘蔽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呐粘,死亡現(xiàn)場(chǎng)離奇詭異满俗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)作岖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門唆垃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痘儡,你說我怎么就攤上這事辕万。” “怎么了沉删?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵渐尿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我矾瑰,道長(zhǎng)砖茸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任脯倚,我火速辦了婚禮渔彰,結(jié)果婚禮上嵌屎,老公的妹妹穿的比我還像新娘。我一直安慰自己恍涂,他們只是感情好宝惰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著再沧,像睡著了一般尼夺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炒瘸,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天淤堵,我揣著相機(jī)與錄音,去河邊找鬼顷扩。 笑死拐邪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隘截。 我是一名探鬼主播扎阶,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼婶芭!你這毒婦竟也來了东臀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤犀农,失蹤者是張志新(化名)和其女友劉穎惰赋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呵哨,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赁濒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孟害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片流部。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纹坐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舞丛,我是刑警寧澤耘子,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站球切,受9級(jí)特大地震影響谷誓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吨凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一捍歪、第九天 我趴在偏房一處隱蔽的房頂上張望户辱。 院中可真熱鬧,春花似錦糙臼、人聲如沸庐镐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)必逆。三九已至,卻和暖如春揽乱,著一層夾襖步出監(jiān)牢的瞬間名眉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工凰棉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留损拢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓撒犀,卻偏偏與公主長(zhǎng)得像福压,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绘证,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 1.關(guān)于閉包 什么是閉包隧膏? 閉包是有權(quán)限訪問其它函數(shù)作用域內(nèi)的變量的一個(gè)函數(shù)。 在js中嚷那,變量分為全局變量和局部變...
    自律寶藏男孩閱讀 308評(píng)論 0 0
  • 任何一門語(yǔ)言的學(xué)習(xí)都可以從下面幾個(gè)方面入手: 數(shù)據(jù)類型 操作符 表達(dá)式 語(yǔ)句 流程控制語(yǔ)句 函數(shù) 對(duì)象 內(nèi)置數(shù)據(jù)類...
    鐵憨憨的職業(yè)生涯閱讀 448評(píng)論 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5胞枕? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,489評(píng)論 1 45
  • 漸變的面目拼圖要我怎么拼派桩? 我是疲乏了還是投降了? 不是不允許自己墜落蚌斩, 我沒有滴水不進(jìn)的保護(hù)膜铆惑。 就是害怕變得面...
    悶熱當(dāng)乘涼閱讀 4,246評(píng)論 0 13
  • 夜鶯2517閱讀 127,720評(píng)論 1 9