<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • JS中作用域的銷毀和不銷毀的情況總結(jié)

          2018-5-25    seo達(dá)人

          如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點(diǎn)這里

          window全局作用域->頁面關(guān)掉才銷毀
          函數(shù)執(zhí)行會形成私有的作用域

          1)作用域的銷毀
          一般情況下,函數(shù)執(zhí)行形成一個私有的作用域,當(dāng)執(zhí)行完成后就銷毀了->節(jié)省內(nèi)存空間

          2)作用域的不立即銷毀
          function fn(){
          var i=10;
          return function(n){
          console.log(n+i++);
          }
          }
          fn()(15);//->先執(zhí)行fn,有一個私有的變量i=10,返回一個堆內(nèi)存地址 xxxfff111,我們發(fā)現(xiàn)這個地址還用到了一次,那么當(dāng)前的這個fn形成私有作用域(A)就不能立即銷毀了,xxxfff111(15)->輸出25,A中的i變?yōu)?1;當(dāng)xxxfff111執(zhí)行完了,發(fā)現(xiàn)這個地址沒用了,瀏覽器就把A、xxxfff111都釋放了

          fn()(20);//->在執(zhí)行fn的時候一切都從新開始了,和上面的步驟是一樣的->輸出30

          3)作用域的不銷毀:形成一個私有作用域,里面的內(nèi)容被外面占用了
          function fn(){
          var i=10;
          return function(n){
          console.log(n+i++);
          }
          }
          var f=fn();//->fn執(zhí)行形成一個私有的作用域A,A中有一個私有的變量i=10,A中返回一個地址xxxfff11,被外面的f占用了,那么當(dāng)前的A就不能銷毀了
          f(15);//->輸出25,讓A中的i=11
          f(20);//->輸出31,讓A中的i=12

          當(dāng)我們知道f用完的時候,為了優(yōu)化性能,我們讓f=null,這樣的話A中的xxxfff111沒人占用了,瀏覽器會把A和xxxfff111都釋放了


          幾種不銷毀常用到的形式:
          1)函數(shù)執(zhí)行,返回一個引用數(shù)據(jù)類型的值,并且在函數(shù)的外面被別人接收了,那么當(dāng)前函數(shù)形成的私有作用域就不在銷毀了–>例如上面的案例

          2)在函數(shù)執(zhí)行的時候,里面的一個小函數(shù)的地址賦值給了我們的外面元素的點(diǎn)擊事件,那么當(dāng)前小函數(shù)也相當(dāng)于被外面占用了,大函數(shù)執(zhí)行形成的私有的作用域也不銷毀了
          //每一次循環(huán)都執(zhí)行自執(zhí)行函數(shù)形成一個私有的作用域(循環(huán)三次就有三個作用域,每一個作用域中都有一個i,第一個存儲的是0,第二個存數(shù)的是1..),在每一個私有的作用域中都把里面的函數(shù)綁定給了外面元素的點(diǎn)擊事件,這樣的話每一次形成的作用域都不銷毀了(三個不銷毀的作用域)
          var oLis=document.getElementsByTagName(“l(fā)i”);
          for(var i=0;i<oLis.length;i++){
          ~function(i){
          oLis[i].onclick=function(){
          tabChange(i);
          }
          }(i);
          }

          3)在使用setTimeout實(shí)現(xiàn)輪詢動畫的時候,我們?nèi)绻鹠ove需要傳遞參數(shù)值,那么像下面這樣的寫法會行成很多的不銷毀的作用域,非常的耗性能
          function move(tar){
          <js code>

          //window.setTimeout(move,10); ->第二次執(zhí)行move的時候我們沒有給它傳值(這樣寫不行)
          window.setTimeout(function(){
          move(tar);
          },10);//->這樣寫實(shí)現(xiàn)了,但是每一次執(zhí)行定時器都會形成一個私有的所用域(匿名函數(shù)形成的)A,在A中使用了上級作用域中的tar的值,而且執(zhí)行了move又形成了一個小的作用域(而在小的作用域中會使用tar的值),這樣每一次定時器形成的A都不能銷毀了
          }
          move(100);//->第一次這樣執(zhí)行傳遞100

          //解決辦法:
          function move(tar){
          ~function _move(){
          <js code>
          window.setTimeout(_move,10);
          }();
          }
          move(100);//->第一次這樣執(zhí)行傳遞100


          JS中內(nèi)存空間釋放的問題(堆內(nèi)存、棧內(nèi)存)
          [谷歌瀏覽器]
          我們開辟一個內(nèi)存,可能或有一些其他的變量等占用了這個內(nèi)存,谷歌瀏覽器都會間隔一段時間看這個內(nèi)存還有沒有被占用,如果發(fā)現(xiàn)有沒有被占用的內(nèi)存了,就自己幫我們回收了(內(nèi)存釋放)

          [火狐和IE]
          我們開個內(nèi)存,當(dāng)我們引用了它,就在內(nèi)存中記錄一個數(shù),增加一個引用瀏覽器就把這個數(shù)+1,減少一個引用,瀏覽器就把這個數(shù)-1…當(dāng)減到零的時候?yàn)g覽器就把這個內(nèi)存釋放了;但是有些情況下(尤其是IE)記著記著就弄亂了,內(nèi)存就不能釋放了–>瀏覽器的內(nèi)存泄露

          var obj={};
          我們養(yǎng)成一個好的習(xí)慣,當(dāng)我們obj這個對象使用完成了,我們手動的obj=null (null空對象指針),瀏覽器會自己把剛才的堆內(nèi)存釋放掉


          藍(lán)藍(lán)設(shè)計www.sdgs6788.com )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計、 網(wǎng)站建設(shè) 平面設(shè)計服務(wù)

          日歷

          鏈接

          個人資料

          藍(lán)藍(lán)設(shè)計的小編 http://www.sdgs6788.com

          存檔

          狠狠色丁香久久婷婷综合图片| 国产精品99久久久久久猫咪| 久久精品国产亚洲av麻豆图片| 久久综合亚洲色HEZYO国产| 久久久久亚洲AV片无码下载蜜桃| 久久久久亚洲av无码专区喷水| 久久免费美女视频| 久久香蕉国产线看观看精品yw| 久久中文字幕无码专区| 五月丁香综合激情六月久久| 久久久久国产精品| 亚洲国产另类久久久精品| 97久久香蕉国产线看观看| 久久精品国产一区二区电影| 久久综合亚洲色HEZYO社区| 国产精品久久国产精麻豆99网站| 无码8090精品久久一区| 色综合合久久天天综合绕视看| 久久婷婷国产剧情内射白浆 | 久久精品天天中文字幕人妻| 久久99国产精品成人欧美| 国产91久久精品一区二区| 久久久久久国产精品无码下载| 狠狠色丁香婷婷综合久久来来去| 久久精品中文无码资源站| 亚洲AV无码成人网站久久精品大| 日日狠狠久久偷偷色综合免费| 久久本道伊人久久| 久久精品免费一区二区三区| 久久国产精品成人片免费| 欧美一区二区三区久久综| 久久WWW免费人成一看片| 怡红院日本一道日本久久| 狠狠色丁香久久综合婷婷| 久久精品国产亚洲AV大全| 久久久久人妻一区二区三区vr| 久久精品亚洲AV久久久无码| 亚洲精品99久久久久中文字幕| 久久精品国产一区二区三区| 一本久久综合亚洲鲁鲁五月天| 久久精品国产男包|