最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript變量提升和閉包理解

 更新時間:2018年03月12日 08:48:51   投稿:laozhang  
本篇文章給大家詳細(xì)分析了javascript變量提升和閉包的相關(guān)知識點(diǎn),對此有興趣的朋友可以參考下。

我們先來看一個題目:

<script>
 console.log(typeof a)//undefined
 var a='littlebear';
 console.log(a)//littlebear 
</script>
<script>
 console.log(typeof a)//string
 var a=1;
 console.log(a)//1
</script>

第一個script里可以看出var a 被提升到頂部,a = 'littlebear'被保留在原地。

第二個script,之所以不先打印undefined ,是因?yàn)閍在上面已經(jīng)被var聲明過,所以var a不會再次被提升。

再看一個題目:

<script>
  console.log(a)//function a(){}
  var a=1;
  console.log(a)//1
  function a(){}
  console.log(a)//1
</script>

可以看到function a(){}被提升到最頂端。說明函數(shù)的提升變量的提升

1.變量提升

在ES6之前,JavaScript沒有塊級作用域(一對花括號{}即為一個塊級作用域),只有全局作
用域和函數(shù)作用域。變量提升即將變量聲明提升到它所在作用域的最開始的部分。
上個簡歷的例子如:

console.log(global); // undefined
var global = 'global';
console.log(global); // global

function fn () {
  console.log(a); // undefined
  var a = 'aaa';
  console.log(a); // aaa
}
fn();

之所以會是以上的打印結(jié)果,是由于js的變量提升,實(shí)際上上面的代碼是按照以下來執(zhí)行的:

var global; // 變量提升,全局作用域范圍內(nèi),此時只是聲明,并沒有賦值
console.log(global); // undefined
global = 'global'; // 此時才賦值
console.log(global); // 打印出global
 
function fn () {
  var a; // 變量提升,函數(shù)作用域范圍內(nèi)
  console.log(a);
  a = 'aaa';
  console.log(a);
}
fn();

2.函數(shù)提升

js中創(chuàng)建函數(shù)有兩種方式:函數(shù)聲明式和函數(shù)字面量式。只有函數(shù)聲明才存在函數(shù)提升!如:

console.log(f1); // function f1() {}  
console.log(f2); // undefined 
function f1() {}
var f2 = function() {}

之所以會有以上的打印結(jié)果,是由于js中的函數(shù)提升導(dǎo)致代碼實(shí)際上是按照以下來執(zhí)行的:

function f1() {} // 函數(shù)提升,整個代碼塊提升到文件的最開始
console.log(f1);  
console.log(f2);  
var f2 = function() {}

3.什么是閉包

閉包是有權(quán)訪問另一個函數(shù)作用域的變量的函數(shù)。

簡單的說,Javascript允許使用內(nèi)部函數(shù)---即函數(shù)定義和函數(shù)表達(dá)式位于另一個函數(shù)的函數(shù)體內(nèi)。而且,這些內(nèi)部函數(shù)可以訪問它們所在的外部函數(shù)中聲明的所有局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)。當(dāng)其中一個這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時,就會形成閉包。

4.變量的作用域

要理解閉包,首先要理解變量的作用域。

變量的作用域無非就是兩種:全局變量和局部變量。

Javascript語言的特殊之處,就在于函數(shù)內(nèi)部可以直接讀取全局變量。

其中內(nèi)部函數(shù)中可以訪問外部函數(shù)的變量,是因?yàn)閮?nèi)部函數(shù)的作用域鏈中包含了外部函數(shù)的作用域;

也可以理解為:內(nèi)部函數(shù)的作用范圍輻射到了外部函數(shù)的作用范圍;

var n=999;
function f1(){
 alert(n);
}
f1(); // 999

另一方面,在函數(shù)外部自然無法讀取函數(shù)內(nèi)的局部變量。

function f1(){
 var n=999;
}
alert(n); // error

這里有一個地方需要注意,函數(shù)內(nèi)部聲明變量的時候,一定要使用var命令。如果不用的話,你實(shí)際上聲明了一個全局變量!

function f1(){
  n=999;
}
f1();
alert(n); // 999

5.閉包的寫法和用法

var Circle={ 
  "PI":3.14159, 
  "area":function(r){ 
    return this.PI * r * r; 
  } 
}; 
alert( Circle.area(1.0) );//3.14159

剛開始我沒意識到,這樣寫對象也是一種閉包,今天回頭想想,這就是閉包的經(jīng)典用發(fā)?。?/p>

6.使用閉包的注意點(diǎn)

1)由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。

2)閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。

相關(guān)文章

  • js有效數(shù)字 顯示指定位數(shù)

    js有效數(shù)字 顯示指定位數(shù)

    js有效數(shù)字 顯示指定位數(shù)...
    2007-09-09
  • 封裝html的select標(biāo)簽的js操作實(shí)例

    封裝html的select標(biāo)簽的js操作實(shí)例

    本文將為大家介紹下正如標(biāo)題所示的select操作:清空所有的選項(xiàng)、添加一個選項(xiàng)、根據(jù)值、選中一個選項(xiàng)、根據(jù)下標(biāo),選中一個選項(xiàng),感興趣的朋友可以參考下哈,希望對大家有所幫助
    2013-07-07
  • Javascript下拉刷新的簡單實(shí)現(xiàn)

    Javascript下拉刷新的簡單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Javascript下拉刷新的簡單實(shí)現(xiàn)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • webpack+vue2構(gòu)建vue項(xiàng)目骨架的方法

    webpack+vue2構(gòu)建vue項(xiàng)目骨架的方法

    本篇文章主要介紹了webpack+vue2構(gòu)建vue項(xiàng)目骨架的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Bootstrap實(shí)現(xiàn)彈性搜索框

    Bootstrap實(shí)現(xiàn)彈性搜索框

    這篇文章主要介紹了Bootstrap實(shí)現(xiàn)彈性搜索框的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • Webpack簡單實(shí)現(xiàn)兩個自定義插件詳解

    Webpack簡單實(shí)現(xiàn)兩個自定義插件詳解

    這篇文章主要為大家詳細(xì)介紹了Webpack簡單實(shí)現(xiàn)兩個自定義插件的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • js回文數(shù)的4種判斷方法示例

    js回文數(shù)的4種判斷方法示例

    這篇文章主要給大家介紹了關(guān)于js回文數(shù)的4種判斷方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 利用Promise自定義一個GET請求的函數(shù)示例代碼

    利用Promise自定義一個GET請求的函數(shù)示例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Promise自定義一個GET請求的函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Promise具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 彈出窗口并且此窗口帶有半透明的遮罩層效果

    彈出窗口并且此窗口帶有半透明的遮罩層效果

    這篇文章主要介紹了如何點(diǎn)擊一個按鈕實(shí)現(xiàn)彈出一個居中窗口,并且此窗口帶有半透明的遮罩層效果,需要的朋友可以參考下
    2014-03-03
  • JavaScript如何將時間戳轉(zhuǎn)化為年月日時分秒格式

    JavaScript如何將時間戳轉(zhuǎn)化為年月日時分秒格式

    這篇文章主要給大家介紹了關(guān)于JavaScript如何將時間戳轉(zhuǎn)化為年月日時分秒格式的相關(guān)資料,在前端的日常工作當(dāng)中,時間戳的使用也是不少的,有時后端返回給我們的數(shù)據(jù)是一個時間戳,我們需要轉(zhuǎn)換成年月日,時分秒的形式展示在頁面當(dāng)中,需要的朋友可以參考下
    2023-11-11

最新評論

施甸县| 长子县| 荆门市| 九江市| 万荣县| 凤凰县| 韶山市| 宣武区| 漯河市| 定西市| 栖霞市| 奎屯市| 乌鲁木齐市| 云和县| 中江县| 绿春县| 子长县| 淳化县| 疏勒县| 正安县| 大冶市| 诸城市| 阜康市| 舒兰市| 积石山| 天水市| 普定县| 西丰县| 东辽县| 康马县| 信丰县| 祁连县| 雷州市| 莒南县| 屏东市| 青田县| 永平县| 淮安市| 蓬安县| 江孜县| 临西县|