日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

深入了解JS之作用域和閉包

瀏覽:160日期:2024-05-04 08:00:22
作用域和閉包

ECMAScript5: JS 的代碼沒有代碼塊;使用函數(shù)運(yùn)行的機(jī)制進(jìn)行創(chuàng)建閉包;閉包就是作用域的意思;

ES5中,JS中只有函數(shù)才可以創(chuàng)建能操作的作用域;

JavaScript中的內(nèi)存也分為棧內(nèi)存和堆內(nèi)存。一般來(lái)說(shuō),棧內(nèi)存中存放的是存儲(chǔ)對(duì)象的地址,而堆內(nèi)存中存放的是存儲(chǔ)對(duì)象的具體內(nèi)容。對(duì)于原始類型的值而言,其地址和具體內(nèi)容都存在與棧內(nèi)存中;而基于引用類型的值,其地址存在棧內(nèi)存,其具體內(nèi)容存在堆內(nèi)存中。堆內(nèi)存與棧內(nèi)存是有區(qū)別的,棧內(nèi)存運(yùn)行效率比堆內(nèi)存高,空間相對(duì)推內(nèi)存來(lái)說(shuō)較小,反之則是堆內(nèi)存的特點(diǎn)。所以將構(gòu)造簡(jiǎn)單的原始類型值放在棧內(nèi)存中,將構(gòu)造復(fù)雜的引用類型值放在堆中而不影響棧的效率。

函數(shù)執(zhí)行時(shí)形成私有作用域

函數(shù)執(zhí)行的時(shí)候(直接目的:讓函數(shù)體中的代碼執(zhí)行)會(huì)形成一個(gè)新的私有的作用域(棧內(nèi)存),供函數(shù)體中的代碼執(zhí)行;

給形參賦值 私有作用域下的預(yù)解釋 私有作用域下的代碼執(zhí)行

形成的新的私有的作用域還保護(hù)了里面的私有變量不受外界的影響,我們把函數(shù)的這種保護(hù)機(jī)制叫”閉包”:為什么要有作用域;因?yàn)樽兞恳?guī)定活動(dòng)范圍的,為便于管理不同范圍的變量;所以要給變量設(shè)置活動(dòng)范圍;

預(yù)解釋也是在各自的作用域里進(jìn)行預(yù)解釋的;

function fn(){ var a=1;}fn();fn();console.log(a);//Uncaught ReferenceError: a is not defined;

因?yàn)閍沒有聲明和定義過(guò),所以報(bào)錯(cuò)了;

上面的fn運(yùn)行了兩次,所以產(chǎn)生了兩個(gè)堆內(nèi)存;兩個(gè)作用域(作用域也就是閉包)各自分別有一個(gè)a的變量;a的值都是數(shù)字1,但是兩個(gè)變量是不相等的;兩個(gè)a之間是沒有任何關(guān)系的;

就好比我們都屬于人類;我們都繼承了人類這個(gè)對(duì)象所具有的特征;我有一雙手,你也有一雙手,但是我們兩個(gè)人的手是沒有關(guān)系的;我的手不等于你的手;

全局變量和私有變量 在全局作用域下聲明的變量是全局變量; 在私有作用域中聲明的變量是私有變量;函數(shù)的形參也是私有的變量; 如何區(qū)分函數(shù)中出現(xiàn)的變量是私有的還是非私有的?

首先看是否為形參,然后看是否在私有作用域中聲明過(guò)(有沒有var過(guò)),兩者有其一就是私有的變量,那么在當(dāng)前函數(shù)中不管什么位置出現(xiàn)都是私有的,和全局的沒有半毛錢的關(guān)系;如果兩者都沒有,說(shuō)明不是私有的;如果一個(gè)函數(shù)中出現(xiàn)的變量不是私有的,那么會(huì)往其上級(jí)作用域查找,上級(jí)沒有則繼續(xù)查找,一直找到window為止,如果window也沒有呢?

如果是獲取:會(huì)報(bào)錯(cuò)

function fn() { console.log(num);//Uncaught ReferenceError: num is not defined}fn();

如果是設(shè)置:不是私有的,找全局,全局沒有的話相當(dāng)于給全局加一個(gè)

function fn() { num = 13;//相當(dāng)于給window增加了一個(gè)叫做num的屬性名,屬性值是13 window.num=13;}fn();console.log(num);//13如何查找當(dāng)前作用域的上級(jí)作用域?

當(dāng)前作用域的上級(jí)作用域是誰(shuí)和函數(shù)在哪執(zhí)行的沒有任何的關(guān)系,我們只需要看當(dāng)前函數(shù)是在哪個(gè)作用域下定義的,那么它的上級(jí)作用域就是誰(shuí);

下面是查找上一級(jí)作用域,一直找到window的案例;

var total = 100;function fn() { var total = 10; return function () { console.log(total); }//如果返回的是一個(gè)引用數(shù)據(jù)類型的值(對(duì)象、數(shù)組、函數(shù)...),首先是把這個(gè)值開辟一個(gè)內(nèi)存空間,有一個(gè)地址,然后把內(nèi)存地址返回 ->例如在這里其實(shí)返回的就是 return xxxfff111;}var f = fn();//f=xxxfff111;f();// 10

//輸出的結(jié)果是 10 還是 100 ? 為什么 ?

如果是在自執(zhí)行函數(shù)里呢?

var total = 100;function fn() { var total = 10; return function () { console.log(total); }}var f = fn();//f=xxxfff111;~function () {var total = 1200;f();//->;里面變量的上級(jí)作用域是誰(shuí)}();// 10

下面代碼輸出的是什么?

var a=0;var b='0';function fn(){ console.log(a);console.log(b);console.log(typeof a); console.log(typeof b);a='1';var b=1;console.log(a);console.log(b);console.log(typeof a);console.log(typeof b);}fn();//運(yùn)行后會(huì)輸出什么?如果沒有這行代碼;函數(shù)fn的定義是沒有意義的;函數(shù)只聲明定義,而不運(yùn)行是沒有任何意義的;//0,undefined,'number','undefined','1',1,'string','number'

預(yù)解釋是作用域中的預(yù)解釋;js里是可以函數(shù)里面套函數(shù)的;都運(yùn)行的時(shí)候,是在函數(shù)創(chuàng)建的作用域里再創(chuàng)建一個(gè)作用域;

下面是作用域的范圍;

var a='window';console.log(a);//windowfunction father(){console.log(a);//undefinedvar a='father';console.log(a);//fatherfunction children(){ console.log(b);//undefined console.log(a);//father var b='flag'; a='children'; console.log(a);//children  }  children();  console.log(a);//children}father();console.log(a);//window

JavaScript中的代碼執(zhí)行順序是從上到下逐條運(yùn)行的;遇到function定義函數(shù)的代碼塊;直接跳過(guò);遇到函數(shù)執(zhí)行的代碼;就找到引用的函數(shù)地址;開始跳到執(zhí)行函數(shù)產(chǎn)生的作用域中執(zhí)行代碼;等函數(shù)執(zhí)行完以后,再回到當(dāng)前作用域執(zhí)行下面的代碼;

上面的代碼運(yùn)行后,輸出的是

“window”,undefined,“father”,undefined,“father”,“children”,“children”,“window”

作用域鏈查找:當(dāng)作用域套作用域的時(shí)候,children內(nèi)找不到某個(gè)變量;會(huì)到children的父作用域father中找;當(dāng)father中找不到的時(shí)候;會(huì)到father的父作用域找;一直找到window這個(gè)根作用域;屬于作用域鏈?zhǔn)讲檎遥?/p>函數(shù)運(yùn)行產(chǎn)生的作用域

函數(shù)的運(yùn)行是一個(gè)有生命周期的內(nèi)存地址;

函數(shù)運(yùn)行時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)存地址(產(chǎn)生堆內(nèi)存,函數(shù)保存的就是這個(gè)堆內(nèi)存的地址),當(dāng)此函數(shù)運(yùn)行結(jié)束時(shí),此內(nèi)存地址又會(huì)銷毀;這個(gè)地址,我們無(wú)法保存;它的靈活的,活動(dòng)的;有生命周期的;我們也沒有辦法給這個(gè)作用域起一個(gè)變量名字,也沒辦法保存這個(gè)作用域,JS不提供這種機(jī)制;

也就是說(shuō):在作用域外面是沒辦法控制作用域內(nèi)部的數(shù)據(jù)的;只能在作用域內(nèi)部控制;而且作用域內(nèi)部的代碼可以控制外部的數(shù)據(jù);這種機(jī)制就叫做閉包,閉包與作用域鏈和函數(shù)的運(yùn)行有關(guān)系的;

函數(shù)里的變量,就在這個(gè)內(nèi)存里創(chuàng)建;我們可以把這個(gè)內(nèi)存當(dāng)成一個(gè)對(duì)象;那函數(shù)里的變量就是這個(gè)內(nèi)存對(duì)象的屬性;

函數(shù)的定義和函數(shù)的執(zhí)行是兩碼事(fn和fn()的區(qū)別);函數(shù)的執(zhí)行與函數(shù)的定義地方無(wú)關(guān);這個(gè)一定要理解!

閉包

作用域就是閉包;我理解的是相同的意思;只是不同人對(duì)這個(gè)機(jī)制的叫法不同;閉包是一種機(jī)制;并不是某種形式或者概念;最大的閉包就是window,我們可以把window當(dāng)做一個(gè)閉包;

權(quán)威指南182頁(yè)中對(duì)閉包的解釋;

權(quán)威指南解釋:函數(shù)的執(zhí)行依賴于變量作用域,這個(gè)作用域是函數(shù)定義時(shí)決定的,而不是函數(shù)調(diào)用時(shí)決定的

注意:函數(shù)對(duì)象可以通過(guò)作用域鏈相互關(guān)聯(lián)起來(lái);函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi),這種特性叫閉包; 批注:這里和作用域鏈有關(guān)系的,和閉包沒有關(guān)系的;函數(shù)的作用域是誰(shuí),和在哪運(yùn)行沒有關(guān)系;只和在哪兒定義有關(guān)系;

如下代碼;

var a=0;function fn(){ var a=1; function fm(){ console.log(a); } return fm;}var testFn1=fn();//hanshu這個(gè)變量就相當(dāng)于fm函數(shù);testFn1();//相當(dāng)于fm函數(shù)運(yùn)行;此時(shí)輸出的是1;而不是0;雖然是在window中運(yùn)行的;但是在fn中定義的;所以a找到的是fm上一級(jí)作用域fm的a;而不是window中的a;作用域不銷毀的情況|內(nèi)存釋放

作用域不銷毀的總結(jié):當(dāng)函數(shù)內(nèi)return一個(gè)引用數(shù)據(jù)類型;并且函數(shù)外面有一個(gè)變量接收這個(gè)引用數(shù)據(jù)類型;此時(shí)的作用域是不銷毀的;

堆內(nèi)存

對(duì)象數(shù)據(jù)類型或者函數(shù)數(shù)據(jù)類型在定義的時(shí)候首先都會(huì)開辟一個(gè)堆內(nèi)存,堆內(nèi)存有一個(gè)引用的地址,如果外面有變量等指到了這個(gè)地址,我們就說(shuō)這個(gè)內(nèi)存被占用了,就不能銷毀了;

堆內(nèi)存釋放的問題->堆內(nèi)存用來(lái)存儲(chǔ)引用數(shù)據(jù)類型值的

[谷歌]:瀏覽器會(huì)每隔一段時(shí)間,看我們的堆內(nèi)存是否還有其他的東西引用著,如果還在被占用著,瀏覽器不會(huì)進(jìn)行處理;但是如果我們的堆內(nèi)存已經(jīng)沒有任何的東西占用了,那么瀏覽器會(huì)把這個(gè)堆內(nèi)存進(jìn)行回收釋放

[IE和火狐]:開辟了一個(gè)堆內(nèi)存,我們有一個(gè)占用的時(shí)候?yàn)g覽器記一個(gè)數(shù)(記錄有多少個(gè)占用這個(gè)內(nèi)存),當(dāng)我們減少引用的時(shí)候,瀏覽器會(huì)把記數(shù)減1,當(dāng)記的數(shù)字減為0的時(shí)候,瀏覽器會(huì)把我們的堆內(nèi)存回收釋放

var obj1 = {name: '張三'};var obj2 = obj1;//我們想要讓堆內(nèi)存釋放/銷毀,只需要把所有引用它的變量值賦值為null即可,如果當(dāng)前的堆內(nèi)存沒有任何東西被占用了,那么瀏覽器會(huì)在空閑的時(shí)候把它銷毀...obj1 = null;obj2 = null;

以上就是深入了解JS之作用域和閉包的詳細(xì)內(nèi)容,更多關(guān)于JavaScript 作用域和閉包的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91精品国产经典在线观看| 日韩欧美视频专区| 欧美日韩黑人| 今天的高清视频免费播放成人| 亚洲国产欧美日本视频| 亚洲国产成人二区| 久久毛片亚洲| 91精品国产调教在线观看| 久久久蜜桃一区二区人| 日韩久久精品网| 国产精品成人国产| 丰满少妇一区| 日本不卡免费高清视频在线| 四虎4545www国产精品| 婷婷精品视频| 免费精品视频| 日韩区一区二| 国产精品v一区二区三区| 九九99久久精品在免费线bt| 成人台湾亚洲精品一区二区| 天堂日韩电影| 香蕉久久夜色精品国产| 婷婷久久免费视频| 国产精品2023| 精品视频在线观看网站| 成人亚洲欧美| 在线综合亚洲| 欧美视频精品全部免费观看| 91亚洲国产高清| 美女毛片一区二区三区四区| 免费久久精品视频| 免费一级欧美片在线观看网站| 在线天堂资源www在线污| 免费国产自久久久久三四区久久| 婷婷激情图片久久| 色8久久久久| 国产劲爆久久| 在线日韩中文| 天堂va欧美ⅴa亚洲va一国产| 久久wwww| 成人在线视频中文字幕| 日韩视频免费| 国产精品美女午夜爽爽| 国产一区日韩欧美| 日韩不卡一二三区| 在线天堂资源www在线污| 日韩视频一区| 国产精品18| 久久国产精品成人免费观看的软件| 性色av一区二区怡红| 国产精品香蕉| 91成人网在线观看| 国产精品扒开腿做爽爽爽软件| 亚洲1234区| 国产精品三上| 欧美影院精品| 亚洲二区免费| 欧美日韩伊人| 伊人精品一区| 欧美激情99| 国产精品美女久久久| 欧美aaaaaa午夜精品| 中文欧美日韩| 国产一区不卡| 婷婷成人av| 欧美日韩在线观看视频小说| 国产区精品区| 亚洲一区二区三区高清不卡| 国产精品2023| 免费日韩视频| 91免费精品| 日韩不卡免费视频| 伊人久久亚洲影院| 麻豆精品在线视频| 日韩精品一区第一页| 高清av一区| 亚洲欧洲日韩| 五月天综合网站| 国产精品成人a在线观看| 日本一区二区三区中文字幕| 亚洲成人精品| 乱一区二区av| 蜜臀av国产精品久久久久 | 免费观看在线综合| 精品日本视频| 天堂久久av| 99在线观看免费视频精品观看| 免费亚洲婷婷| 欧美在线不卡| 亚洲天堂av资源在线观看| 日韩一区自拍| 精品一区视频| 日韩av二区在线播放| 亚洲制服少妇| 欧美日韩在线网站| av中文字幕在线观看第一页 | 999在线观看精品免费不卡网站| 精品国产亚洲一区二区三区大结局| 亚洲在线久久| 91精品高清| 蜜桃精品在线| 国产精品毛片一区二区在线看| 青草av.久久免费一区| 日韩午夜黄色| 日韩亚洲国产欧美| 婷婷久久一区| 欧美不卡高清| 国内激情久久| 国产一在线精品一区在线观看| 日韩成人a**站| 久久这里只有精品一区二区| 91成人精品观看| 日韩福利视频网| 日韩精品三区四区| 亚洲精品国产精品粉嫩| 免费人成黄页网站在线一区二区| 亚洲黄色影院| 亚洲一区二区三区高清不卡| aa亚洲婷婷| 美女黄网久久| 亚洲免费专区| 亚洲日韩视频| 综合五月婷婷| 日韩国产在线一| 久久国产欧美日韩精品| 欧美在线91| 日韩av资源网| 人人精品久久| 国产欧美日韩精品一区二区免费 | 在线看片一区| 亚洲精品系列| 亚洲免费一区三区| 亚洲人成亚洲精品| 日日夜夜免费精品视频| 日本伊人午夜精品| 欧美一区激情| 国产精品视频首页| 欧美精品成人| 国产精品igao视频网网址不卡日韩| 国产精品久久久久久久久久白浆| 国产激情久久| 正在播放日韩精品| 久久一区二区三区喷水| 自拍日韩欧美| 亚洲人www| 国产一精品一av一免费爽爽| 国产精品久久久网站| 成人在线视频区| 久久一区二区三区喷水| 亚洲免费中文| 亚洲日本欧美| 欧美激情麻豆| 久久亚洲国产| 香蕉久久久久久久av网站| 天堂精品久久久久| 老司机精品视频网| 久久精品国内一区二区三区水蜜桃| 亚洲福利精品| 日本不卡不码高清免费观看 | 亚洲成人va| 国产精品视区| 欧美一级二级视频| 91亚洲国产| 亚洲欧美日韩视频二区| 久久国产乱子精品免费女| 国产精品theporn| 桃色一区二区| 在线精品视频一区| 九九久久国产| 激情综合网五月| 欧美一区网站| 蜜桃成人精品| 日韩高清中文字幕一区| 国产一区二区三区久久久久久久久| 久久在线视频免费观看| 日韩在线麻豆| 91麻豆国产自产在线观看亚洲| 亚洲色诱最新| 免费日韩一区二区三区| 蜜臀av免费一区二区三区| 天堂俺去俺来也www久久婷婷| 你懂的国产精品永久在线| 一区二区三区视频免费观看 | 亚洲一区成人| 麻豆精品少妇| 欧美综合二区| 国产精品久久久久蜜臀| 亚洲日本国产| 成人片免费看| 日本在线不卡视频一二三区| 都市激情国产精品| 日本一不卡视频| 久久精品国内一区二区三区水蜜桃| 日本不卡视频在线| 国产精品成人一区二区不卡| 天堂精品久久久久| 999国产精品视频| 国产精品久久久久久久久久白浆 | 亚洲不卡系列| 国产日韩欧美三区|