成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

JS中的變量提升和函數(shù)提升

zhunjiee / 1882人閱讀

摘要:什么是函數(shù)作用域下的變量提升和函數(shù)提升函數(shù)作用域中也存在變量提升和函數(shù)提升,這個(gè)和全局作用域下的情況是一模一樣的,就是把作用域想成是全局的就可以了。

在js中有一部分比較難以理解,卻也是在筆試過(guò)程中很容易考的,那就是變量提升和函數(shù)提升的問(wèn)題,這篇文章我會(huì)就變量提升和函數(shù)提升的問(wèn)題拓展一下有關(guān)js函數(shù)的知識(shí)點(diǎn),包括作用域的問(wèn)題,后面還會(huì)有一些小練習(xí)來(lái)判斷自己是否真的搞懂了。
作用域

在js中作用域分為全局作用域和函數(shù)作用域,這里是針對(duì)用var聲明的變量是全局的,還是只是在函數(shù)中可以使用,在es6中新增了兩個(gè)聲明變量的方法,let和var一樣,都是聲明變量的,不過(guò)let是在塊級(jí)作用域下起作用,const是用來(lái)聲明常量的,不能進(jìn)行二次賦值。這里重點(diǎn)是變量提升,就先用var來(lái)講解。

全局作用域 什么是全局作用域?

全局作用域是指在當(dāng)前的script標(biāo)簽內(nèi)定義的變量,所有的函數(shù)都可以使用,它在打開(kāi)時(shí)創(chuàng)建,關(guān)閉時(shí)銷(xiāo)毀。在全局作用域中有一個(gè)全局對(duì)象window,window是由瀏覽器創(chuàng)建的,它里面的方法所有對(duì)象都可以使用。

在全局作用域下創(chuàng)建的變量會(huì)作為window進(jìn)行保存,創(chuàng)建的函數(shù)會(huì)作為window的方法

什么是全局作用域下的變量提升?

終于說(shuō)到變量提升了,那么什么是全局作用域下的變量提升呢?看一下下面的例子:

        console.log(a);//undefined
        var a = 10;
        console.log(a);//10

由于在js中代碼執(zhí)行的順序是從上而下,所以在第一次打印的時(shí)候,要找變量a,如果沒(méi)有變量提升的話(huà)應(yīng)該會(huì)會(huì)報(bào)錯(cuò)說(shuō)a沒(méi)有定義,而這里輸出的是undefined,說(shuō)明a已經(jīng)定義了,但是沒(méi)有賦值。那么這就是變量提升起了作用了。需要注意的是

變量提升只會(huì)提升聲明,而不會(huì)提升賦值,也就是說(shuō)在執(zhí)行第一個(gè)打印操作時(shí),只是存在變量a,a卻沒(méi)有值;

打印結(jié)果是undefined說(shuō)明變量存在,只是沒(méi)有值,而如果是報(bào)錯(cuò)說(shuō)a is not defined的話(huà),就是沒(méi)有變量a。

什么是全局作用域下的函數(shù)提升?

函數(shù)提升和變量提升是一樣的道理,都是將本來(lái)應(yīng)該在后面執(zhí)行的代碼全部放在前面,只是變量提升是提升聲明;而函數(shù)提升是提升整個(gè)函數(shù),也就是在代碼還沒(méi)開(kāi)始執(zhí)行的時(shí)候函數(shù)就會(huì)被創(chuàng)建。

調(diào)用在定義函數(shù)之后
        console.log(a);//undegfined
        var a = 10;
        function fun(){
            console.log(a);
        }
        fun();//10   

這里函數(shù)調(diào)用是在定義函數(shù)之后,看不出來(lái)函數(shù)是否存在提升的情況,但這里值得一提的是,如果函數(shù)沒(méi)有需要訪(fǎng)問(wèn)的變量的時(shí)候,就會(huì)去上一層找,就是這個(gè)全局的a,值是10,所以會(huì)打印10.

調(diào)用在定義函數(shù)之前
        console.log(a);//undefined
        fun();//undefined
        var a = 10;
        function fun(){
            console.log(a);
        }
           

這里函數(shù)調(diào)用是在定義函數(shù)之前,并且是在a賦值之前。首先我們來(lái)判斷一下,如果沒(méi)有函數(shù)提升的話(huà)會(huì)怎樣,執(zhí)行到fun這一行,就會(huì)發(fā)現(xiàn)fun沒(méi)有定義,然后會(huì)報(bào)錯(cuò)fun is not a function;現(xiàn)在有了函數(shù)提升過(guò)后,執(zhí)行到fun后,會(huì)去找a,而a只是定義了沒(méi)有賦值,就會(huì)打印一個(gè)undefined,和第一個(gè)打印一樣的結(jié)果。

函數(shù)作用域 什么是函數(shù)作用域?

函數(shù)作用域,顧名思義,就是只在函數(shù)中能夠使用的變量,函數(shù)作用域和全局作用域之間的關(guān)系是函數(shù)作用域中的方法可以使用全局的變量,而全局方法不能使用函數(shù)中的便來(lái)變量,每個(gè)函數(shù)之間也是不能取到各自函數(shù)內(nèi)部的值的。下面的圖幫助理解一下:

每個(gè)函數(shù)作用域是相互獨(dú)立的,在函數(shù)內(nèi)部定義的變量是不能進(jìn)行相互調(diào)用的。

什么是函數(shù)作用域下的變量提升和函數(shù)提升?

函數(shù)作用域中也存在變量提升和函數(shù)提升,這個(gè)和全局作用域下的情況是一模一樣的,就是把作用域想成是全局的就可以了。

練習(xí)
        var a = 123;
        function fun(){
            alert(a);//123
        }
        fun();
        var a = 123;
        function fun(){
            alert(a);//456
            var a = 456;
        }
        fun();
        alert(a);//123
        var a = 123;
        function fun(){
            alert(a);//123
            a = 456;
        }
        fun();
        alert(a);//456(456是因?yàn)楹瘮?shù)內(nèi)部將全局的變量a的值改變了)
        var a = 123;
        function fun(a){
            alert(a);//123
            a = 456;
        }
        fun(123);
        alert(a);//456
 var a = 123;
        function fun(a){
            alert(a);//undefined(undefined是因?yàn)閒un在被調(diào)用的時(shí)候沒(méi)有傳遞實(shí)參)
            a = 456;
        }
        fun();
        alert(a);//456
總結(jié)

在面試的筆試題中很容易碰到這樣的題,有的可能還不只是考這個(gè)知識(shí)點(diǎn),可能還會(huì)涉及到閉包之類(lèi)的,或者更難以理解一點(diǎn)兒的this指向問(wèn)題,但是不管怎樣,只要知道原理,怎么考都沒(méi)關(guān)系,愿大家在前端這段路上堅(jiān)持走下去,加油!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/97812.html

相關(guān)文章

  • js 變量提升閉包理解

    摘要:變量的作用域無(wú)非就是兩種全局變量和局部變量。其中內(nèi)部函數(shù)中可以訪(fǎng)問(wèn)外部函數(shù)的變量,是因?yàn)閮?nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域也可以理解為內(nèi)部函數(shù)的作用范圍輻射到了外部函數(shù)的作用范圍另一方面,在函數(shù)外部自然無(wú)法讀取函數(shù)內(nèi)的局部變量。 以前學(xué)習(xí)的時(shí)候,了解過(guò)變量提升和閉包,但是沒(méi)有深入了解,網(wǎng)上查了資料,這里記錄下,只供參考。部分內(nèi)容引用: https://www.cnblogs.c...

    luoyibu 評(píng)論0 收藏0
  • 原型模式故事鏈(4)--JS執(zhí)行上下文、變量提升、函數(shù)聲明

    摘要:代碼在執(zhí)行之前會(huì)先全局中變量提升函數(shù)聲明。函數(shù)的執(zhí)行上下文,也就是在這個(gè)函數(shù)范圍內(nèi)找到函數(shù)執(zhí)行上下文中函數(shù)范圍內(nèi),所有用聲明的變量。函數(shù)執(zhí)行時(shí),按照?qǐng)?zhí)行位置查找變量作用域只會(huì)向上查找。下一回變量作用域與閉包 上一章:JS的數(shù)據(jù)類(lèi)型 傳送門(mén):https://segmentfault.com/a/11... 好!話(huà)不多少,我們就開(kāi)始吧。對(duì)變量提升和函數(shù)聲明的理解,能讓你更清楚容易的理解,...

    melody_lql 評(píng)論0 收藏0
  • 原型模式故事鏈(4)--JS執(zhí)行上下文、變量提升函數(shù)聲明

    摘要:代碼在執(zhí)行之前會(huì)先全局中變量提升函數(shù)聲明。函數(shù)的執(zhí)行上下文,也就是在這個(gè)函數(shù)范圍內(nèi)找到函數(shù)執(zhí)行上下文中函數(shù)范圍內(nèi),所有用聲明的變量。函數(shù)執(zhí)行時(shí),按照?qǐng)?zhí)行位置查找變量作用域只會(huì)向上查找。下一回變量作用域與閉包 上一章:JS的數(shù)據(jù)類(lèi)型 傳送門(mén):https://segmentfault.com/a/11... 好!話(huà)不多少,我們就開(kāi)始吧。對(duì)變量提升和函數(shù)聲明的理解,能讓你更清楚容易的理解,...

    zhigoo 評(píng)論0 收藏0
  • 原型模式故事鏈(4)--JS執(zhí)行上下文、變量提升、函數(shù)聲明

    摘要:代碼在執(zhí)行之前會(huì)先全局中變量提升函數(shù)聲明。函數(shù)的執(zhí)行上下文,也就是在這個(gè)函數(shù)范圍內(nèi)找到函數(shù)執(zhí)行上下文中函數(shù)范圍內(nèi),所有用聲明的變量。函數(shù)執(zhí)行時(shí),按照?qǐng)?zhí)行位置查找變量作用域只會(huì)向上查找。下一回變量作用域與閉包 上一章:JS的數(shù)據(jù)類(lèi)型 傳送門(mén):https://segmentfault.com/a/11... 好!話(huà)不多少,我們就開(kāi)始吧。對(duì)變量提升和函數(shù)聲明的理解,能讓你更清楚容易的理解,...

    netScorpion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<