日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JavaScript变量作用域和内存问题(js高级程序设计总结)

發(fā)布時(shí)間:2025/3/13 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript变量作用域和内存问题(js高级程序设计总结) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1,變量

????? ECMAScript和JavaScript是等同的嗎?個(gè)人認(rèn)為是否定的。我的理解是這樣的,ECMAScript是一套完整的標(biāo)準(zhǔn)或者說(shuō)協(xié)議,而JavaScript是在瀏覽器上實(shí)現(xiàn)的一套腳本語(yǔ)言。也就是說(shuō),ECMAScript是JavaScript的父類(lèi)標(biāo)準(zhǔn)。JavaScript是ECMAScript的具體實(shí)現(xiàn)。所有ECMAScript定義的數(shù)據(jù)類(lèi)型或者語(yǔ)言特性實(shí)際上都是偽代碼的形式規(guī)定的。當(dāng)然如果可以,ECMAScript也可以有服務(wù)器實(shí)現(xiàn),單片機(jī)實(shí)現(xiàn)(不一定恰當(dāng))。如果說(shuō)ECMAScript是接口好像也挺形象。

????? JavaScript的基本數(shù)據(jù)類(lèi)型(原始數(shù)據(jù)類(lèi)型)有五種,分別是:Undefined、Null、Boolean、Number、String。基本數(shù)據(jù)類(lèi)型指的是那些保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段。為什么要保存到棧內(nèi)存呢?因?yàn)榛緮?shù)據(jù)類(lèi)型值的大小實(shí)際上是固定不變的。換句話說(shuō),這些數(shù)據(jù)是完全保存在內(nèi)存中的一個(gè)位置。因?yàn)榇颂攸c(diǎn)所以對(duì)于基本數(shù)據(jù)類(lèi)型的訪問(wèn)實(shí)際上是按值訪問(wèn),因?yàn)槲覀儗?shí)際上操作的就是保存的值。

????? JavaScript中另一種數(shù)據(jù)類(lèi)型叫做引用類(lèi)型值。和基本數(shù)據(jù)類(lèi)型不同,引用數(shù)據(jù)內(nèi)型是保存在堆內(nèi)存中的對(duì)象。意思是變量中保存的實(shí)際上只是一個(gè)指針,這個(gè)指針指向內(nèi)存中的另一個(gè)位置,該位置保存對(duì)象。而這個(gè)變量指針是保存在棧內(nèi)存中的。同理,此類(lèi)型值的訪問(wèn)實(shí)際上是訪問(wèn)了指向?qū)ο蟮闹羔?#xff0c;從而間接的訪問(wèn)數(shù)據(jù)對(duì)象。

????? 下面再聊一下變量的賦值過(guò)程:

var a=1; var b=a; a++; alert(a);//2 alert(b); //1

????? 很明顯了。基本數(shù)據(jù)類(lèi)型的賦值操作實(shí)際上是獨(dú)立的!

????? 下面再看一個(gè)引用類(lèi)型的例子:

var str = new String("hello,hz"); var newStr = str; str.name="huazi"; alert(str.name); //huazi alert(newStr.name); //huazi

????? 實(shí)際上str和newStr是指向了同一塊堆內(nèi)存。當(dāng)然,str和newStr都是在棧內(nèi)存的指針變量。

2.函數(shù)參數(shù)問(wèn)題

?????? 對(duì)于JavaScript的函數(shù)傳參問(wèn)題,分為兩種情況。若是基本數(shù)據(jù)類(lèi)型那么就傳遞的是引用,若是對(duì)象或者引用那么就是傳遞的引用。當(dāng)然你也可以理解為所有的函數(shù)參數(shù)都是值傳遞,只不過(guò)值需要分為兩種情況。值、指針。、

function test(data){return data++; } var num = 10; var res = test(num); alert(num); //10 alert(res); //11

說(shuō)明什么呢?值傳遞就是傳值了,沒(méi)有任何關(guān)聯(lián)關(guān)系.

var obj = new Object("hello,hz"); console.log(obj.name);//Undefiend var fun1 = function(args){args.name="huazi"return args; } var newObj = fun1(obj); console.log(newObj.name);//huazi console.log(obj.name);//huazi

傳遞引用.

3.JavaScript執(zhí)行環(huán)境和作用域

?????? 要理解JavaScript的作用域必須得先聊一聊JavaScript的執(zhí)行環(huán)境.執(zhí)行環(huán)境是JavaScript中的一個(gè)比較重要的概念.執(zhí)行環(huán)境定義了一個(gè)環(huán)境變量對(duì)象與環(huán)境關(guān)聯(lián).當(dāng)然你是操作不了這個(gè)對(duì)象的.但是在瀏覽器解析腳本的時(shí)候是會(huì)用到的.執(zhí)行環(huán)境中定義的函數(shù)和變量都保存在此變量對(duì)象之中.

?????? 全局的執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境.根據(jù)ECMAScript的宿主環(huán)境不同,表示環(huán)境的對(duì)象也是不同的.對(duì)于JavaScript來(lái)說(shuō),宿主是瀏覽器.也就是說(shuō)此全局執(zhí)行環(huán)境是window對(duì)象.當(dāng)某個(gè)環(huán)境的所有代碼被指向完畢之后,該環(huán)境將被銷(xiāo)毀.但是需要注意的是全局對(duì)象window是不被銷(xiāo)毀的.只有當(dāng)關(guān)閉網(wǎng)頁(yè)或者瀏覽器時(shí)window對(duì)象才會(huì)被銷(xiāo)毀.

????? 每個(gè)函數(shù)在執(zhí)行的時(shí)候都會(huì)創(chuàng)建自己的執(zhí)行環(huán)境,當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推入一個(gè)環(huán)境棧中.執(zhí)行完畢,出棧.把控制權(quán)交還給之前的執(zhí)行環(huán)境.這就是ECMAScript的執(zhí)行流就是用此機(jī)制控制著.

???? 作用域鏈是由變量對(duì)象構(gòu)成的,作用域鏈的用途也很明確.就是保證對(duì)環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn).作用域的前端永遠(yuǎn)是當(dāng)前運(yùn)行的代碼的變量對(duì)象.需要注意的是如果此時(shí)執(zhí)行的是一個(gè)函數(shù),那么將其活動(dòng)對(duì)象作為變量對(duì)象.活動(dòng)對(duì)象在最開(kāi)始時(shí)候只包含一個(gè)變量,即參數(shù)對(duì)象arguments.作用域鏈中的下一個(gè)變量對(duì)象就是其父包含變量對(duì)象.變量作用域鏈的最后一個(gè)變量對(duì)象自然就是全局變量對(duì)象.

????? 變量可訪問(wèn)性的判斷是根據(jù)作用域鏈來(lái)查找標(biāo)識(shí)符判斷的,依次回溯.注意此處是依次回溯,所以存在優(yōu)先級(jí)的問(wèn)題.越靠近的變量對(duì)象越用可能被第一個(gè)找到并且調(diào)用.如果沒(méi)有找到自然報(bào)錯(cuò).

????

????? 特別的try-catch和with語(yǔ)句會(huì)延長(zhǎng)作用域鏈.因?yàn)閣ith(?)和catch(error),?和error都是只讀,所以都會(huì)被添加到所在執(zhí)行環(huán)境的變量對(duì)象中.

????? JavaScript是沒(méi)有塊級(jí)作用域的.在寫(xiě)for循環(huán)的時(shí)候可能需要注意一下for(var i=0;….)此種寫(xiě)完,執(zhí)行完for語(yǔ)句后i依然有值,而且不會(huì)立即釋放。

4,垃圾回收內(nèi)存管理

????? JavaScript和java一樣是具有自動(dòng)回收機(jī)制的,也就是說(shuō),執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過(guò)程中使用的內(nèi)存。而C/C++之流是要開(kāi)發(fā)人員手動(dòng)跟蹤內(nèi)存的使用情況的,這是造成很多問(wèn)題的根源。JavaScript的垃圾回收機(jī)制很簡(jiǎn)單:找出那些不再繼續(xù)使用的變量,然后釋放其占用的空間。為此,垃圾回收收集器會(huì)按照固定的時(shí)間間隔周期性地執(zhí)行這個(gè)操作。(不同的瀏覽器對(duì)于時(shí)間間隔的定義是不同的)。

????? 回收策略:

????? 1,標(biāo)記清除

????? JavaScript最常用的垃圾收集方式就是標(biāo)記清除。當(dāng)變量進(jìn)入環(huán)境時(shí),就將變量標(biāo)記為進(jìn)入環(huán)境狀態(tài)。當(dāng)變量離開(kāi)環(huán)境時(shí)將其標(biāo)記為離開(kāi)環(huán)境。可以使用任何方式來(lái)做標(biāo)記,比如翻轉(zhuǎn)某個(gè)特殊位置的位來(lái)標(biāo)記,或者維護(hù)一個(gè)變量列表來(lái)跟蹤標(biāo)記。

????? 垃圾收集器在運(yùn)行的時(shí)候回給沒(méi)個(gè)表里打上標(biāo)記,然后取消掉未在環(huán)境中的變量標(biāo)記。而在此后仍然帶有標(biāo)記的變量就會(huì)被視為準(zhǔn)備刪除的變量。原因是環(huán)境已經(jīng)無(wú)法訪問(wèn)它們了。最后就是垃圾收集器內(nèi)存清除了。

????? 2,引用計(jì)數(shù)

????? 引用計(jì)數(shù)是種已經(jīng)被淘汰的策略,但是在IE的某些版本中,bom和dom元素的內(nèi)存管理仍然采用引用計(jì)數(shù)。因?yàn)檫@些對(duì)象并不是JavaScript原生,是使用C++的COM實(shí)現(xiàn)。而COM是使用引用計(jì)數(shù)實(shí)現(xiàn)。所以還是有必要了解一下。 避免循環(huán)引用造成的bug。

????? 引用計(jì)數(shù)的含義是跟蹤記錄每個(gè)值被引用的次數(shù)。當(dāng)申明一個(gè)變量并且將一個(gè)引用類(lèi)型值賦值給該變量時(shí),這個(gè)值的引用次數(shù)加1.如果同一個(gè)值又被賦值給另一個(gè)值,那這個(gè)值的引用次數(shù)再加1.相反,如果包含對(duì)這個(gè)值引用的變量又取得了一個(gè)新值,則這個(gè)值的引用次數(shù)減1.當(dāng)一個(gè)值的引用次數(shù)為0的時(shí)候,說(shuō)明沒(méi)有辦法再來(lái)引用它了。垃圾回收。

????? 為了安全和避免一些意外情況發(fā)生,建議在使用完全局變量,全局對(duì)象屬性以及循環(huán)引用之后自行解除引用關(guān)系。obj=null;需要注意的是此種做法并沒(méi)有立刻回收內(nèi)存。只是讓其脫離執(zhí)行環(huán)境(肯定被標(biāo)記了,下次收集器恐怕要消滅它)。

轉(zhuǎn)載于:https://www.cnblogs.com/huaziWEB/p/4480561.html

總結(jié)

以上是生活随笔為你收集整理的JavaScript变量作用域和内存问题(js高级程序设计总结)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一区二区三区公司 | 福利一区二区 | 亚洲视频不卡 | 日产精品久久久久久久蜜臀 | 狠狠操你| 日本zzjj | 久久avav | 久久免费国产 | 五月开心网 | 久久国产免费视频 | 色欲狠狠躁天天躁无码中文字幕 | www.香蕉视频| 三级免费黄录像 | 四虎精品成人免费网站 | 欧美偷拍一区二区三区 | 在线观看av大片 | 亚洲经典一区二区三区 | 40一50一60老女人毛片 | 久久久三级 | 久久久精品久 | 久久免费看少妇高潮 | 北岛玲一区二区 | 中文字幕乱码av | 国产午夜无码视频在线观看 | 99自拍视频在线观看 | 三级特黄 | 午夜激情婷婷 | 美女脱衣服一干二净 | 性猛交ⅹxxx富婆video | 国产18精品乱码免费看 | av片手机在线观看 | 男生操女生免费网站 | 久操福利 | 新天堂在线| 啪啪国产精品 | 老头把女人躁得呻吟 | 婷综合| 久久国产色av | 日本欧美一区二区三区 | 怡红院av在线 | 天天操天天射天天舔 | 亚洲免费av电影 | 免费国产羞羞网站视频 | 乱子伦视频在线看 | 女儿的朋友4在线观看 | av大片在线免费观看 | 丁香花高清视频完整电影 | 日韩精品二区在线观看 | 色在线看| 精品国产av 无码一区二区三区 | 国产免费看黄 | 免费观看毛片 | 国产精品偷拍 | 亚洲天堂国产精品 | 亚洲精品乱码久久久久久日本蜜臀 | 国产艳妇疯狂做爰视频 | 水蜜桃久久 | 成人午夜视频网站 | 中文字幕 日韩 欧美 | 免费看女生裸体视频 | 91精品欧美一区二区三区 | 亚洲欧美网 | 欧美黄色大片网站 | 国产精品人人爽 | av黄色天堂 | 午夜一级在线 | 米奇久久 | 日韩欧美国产精品综合嫩v 国产小毛片 | 国产av一区二区三区最新精品 | 另类老妇性bbwbbw图片 | www.麻豆av | 日本一区二区三区在线观看视频 | 国产视频污在线观看 | www.99av| 青娱乐国产在线视频 | 黄色自拍网站 | 色版视频在线观看 | 深夜视频在线观看免费 | 国内激情 | 国产精品啊啊啊 | ass东方小嫩模pics | 人人干97| 国产视频一区二区三区在线观看 | 日本久久综合 | 啪啪一区二区 | 制服丝袜第二页 | 日韩精品一区二区在线看 | 91在线视频观看 | avtt在线观看 | 国产 日韩 欧美 制服丝袜 | 亚洲欧美在线视频观看 | 葵司av在线 | 狠狠撸狠狠干 | 雪花飘电影在线观看免费高清 | 丰满少妇在线观看网站 | 日本一本在线观看 | 欧美在线日韩在线 | 中文字幕在线观看的网站 | 毛片一级免费 |