摘要:所謂變量提升,提升就是為了事先聲明變量。變量提升之后,但其賦值還是留在原本的位置等運(yùn)行到了之后動(dòng)態(tài)賦值,而函數(shù)提升之后直接相當(dāng)于在代碼里抽空了。搞明白這個(gè)例子也就搞懂了作用域中變量和函數(shù)是怎么提升的。
問題
在這個(gè)例子中它應(yīng)該輸出什么?輸出的結(jié)果是6。
這個(gè)例子中它又該輸出什么?輸出的結(jié)果是a(),也就是輸出了函數(shù)指針a。
這雖然是個(gè)變量和函數(shù)提升的問題,但是這兩者到底是怎么提升的?
js是怎么創(chuàng)建變量的var a=1; var b=2;
這是不是聲明了變量就立馬接著給聲明的變量賦值了?
js解析這個(gè)代碼時(shí),它實(shí)際上是按照如下方式解析的
var a; var b; a=1; b=2;
也就是js會(huì)先把所有變量都聲明好了之后,然后才進(jìn)行賦值,并不是聲明一個(gè)變量就賦值,再聲明一個(gè)再賦值。js所謂變量提升,提升就是為了事先聲明變量。
上圖中左邊的例子,js解析時(shí)候是按照按照右邊的代碼解析的。js會(huì)把所有變量都集中提升到作用域頂部事先聲明好,但是它賦值就就并不是像變量聲明那樣集中著一個(gè)個(gè)挨著賦值。原本書寫賦值時(shí)寫在哪里,那么js解析運(yùn)行到那一行之后才會(huì)進(jìn)行賦值,還沒有運(yùn)行到的就不會(huì)事先賦值。也就是變量會(huì)事先聲明,但是變量不會(huì)事先賦值。
函數(shù)和變量都提升時(shí),誰提到前面誰提到后面在作用域中,不管變量和函數(shù)寫在什么位置,所有變量會(huì)被整體提升到作用域頂部,所有函數(shù)也會(huì)被整體提升到作用域頂部,但是函數(shù)整體在變量整體的后面。
從這個(gè)例子中可以看到,變量和函數(shù)都整體提升后,函數(shù)整體在變量的后面。變量提升之后,但其賦值還是留在原本的位置等js運(yùn)行到了之后動(dòng)態(tài)賦值,而函數(shù)提升之后直接相當(dāng)于在代碼里抽空了。
在這個(gè)更復(fù)雜一點(diǎn)的例子中,變量和函數(shù)提升后,js實(shí)際上就把它轉(zhuǎn)變?yōu)榱擞疫叺拇a在運(yùn)行。
搞明白這個(gè)例子也就搞懂了作用域中變量和函數(shù)是怎么提升的。
結(jié)語回到開頭的兩個(gè)問題
它們各自被js轉(zhuǎn)換后如上
一個(gè)思考題,這個(gè)例子該輸出什么?
“提升”的本質(zhì)就是為了事先聲明變量和函數(shù),當(dāng)然函數(shù)只有聲明式函數(shù)才會(huì)被提升,字面量函數(shù)不會(huì)被提升。這種提升就是存在于作用域中,包括全局作用域、函數(shù)作用域(閉包形成的作用域也是個(gè)函數(shù)作用域),總之都是在作用域中聲明變量和函數(shù)時(shí),會(huì)提升到作用域頂部,進(jìn)行事先聲明。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88164.html
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級(jí)作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對(duì)應(yīng)的序號(hào)? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對(duì)作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對(duì)作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級(jí)作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對(duì)應(yīng)的序號(hào)? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對(duì)作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對(duì)作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級(jí)作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對(duì)應(yīng)的序號(hào)? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對(duì)作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對(duì)作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
摘要:是詞法作用域工作模式。使用可以將變量綁定在所在的任意作用域中通常是內(nèi)部,也就是說為其聲明的變量隱式的劫持了所在的塊級(jí)作用域。 作用域與閉包 如何用js創(chuàng)建10個(gè)button標(biāo)簽,點(diǎn)擊每個(gè)按鈕時(shí)打印按鈕對(duì)應(yīng)的序號(hào)? 看到上述問題,如果你能看出來這個(gè)問題實(shí)質(zhì)上是考對(duì)作用域的理解,那么恭喜你,這篇文章你可以不用看了,說明你對(duì)作用域已經(jīng)理解的很透徹了,但是如果你看不出來這是一道考作用域的題目,...
閱讀 2686·2021-11-15 11:38
閱讀 2671·2021-11-04 16:13
閱讀 18403·2021-09-22 15:07
閱讀 1096·2019-08-30 15:55
閱讀 3323·2019-08-30 14:15
閱讀 1739·2019-08-29 13:59
閱讀 3285·2019-08-28 18:28
閱讀 1670·2019-08-23 18:29