国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

javascript變量提升和閉包理解

2024-05-06 16:42:59
字體:
供稿:網(wǎng)友

我們先來看一個(gè)題目:

<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>

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

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

再看一個(gè)題目:

<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沒有塊級(jí)作用域(一對(duì)花括號(hào){}即為一個(gè)塊級(jí)作用域),只有全局作
用域和函數(shù)作用域。變量提升即將變量聲明提升到它所在作用域的最開始的部分。
上個(gè)簡(jiǎn)歷的例子如:

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

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

var global; // 變量提升,全局作用域范圍內(nèi),此時(shí)只是聲明,并沒有賦值console.log(global); // undefinedglobal = 'global'; // 此時(shí)才賦值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() {}

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

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

3.什么是閉包

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

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

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

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

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

剛開始我沒意識(shí)到,這樣寫對(duì)象也是一種閉包,今天回頭想想,這就是閉包的經(jīng)典用發(fā)啊!

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

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

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 仁寿县| 遂川县| 封开县| 阿拉善盟| 霍州市| 大港区| 灵台县| 阜宁县| 黄梅县| 青河县| 宁化县| 谷城县| 凤台县| 大安市| 清水河县| 灵寿县| 清涧县| 蓬莱市| 嘉善县| 都昌县| 裕民县| 闽侯县| 陇南市| 南康市| 周口市| 栾川县| 阳朔县| 云林县| 桂东县| 南开区| 南京市| 札达县| 葫芦岛市| 镇康县| 株洲市| 青田县| 中卫市| 武穴市| 将乐县| 土默特左旗| 淳安县|