亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js變量、作用域及內存詳解

2019-11-20 14:06:59
字體:
來源:轉載
供稿:網友

基本類型值有:undefined,NUll,Boolean,Number和String,這些類型分別在內存中占有固定的大小空間,他們的值保存在棧空間,我們通過按值來訪問的。

(1)值類型:數值、布爾值、null、undefined。
(2)引用類型:對象、數組、函數。

如果賦值的是引用類型的值,則必須在堆內存中為這個值分配空間。由于這種值的大小不固定(對象有很多屬性和方法),因此不能把他們保存到棧內存中。但內存地址大小是固定的,因此可以將內存地址保存在棧內存中。

<script type="text/javascript”>var box = new Object(); //創建一個引用類型var box = "lee";  //基本類型值是字符串box.age = 23;  //基本類型值添加屬性很怪異,因為只有對象才可以添加屬性。alert(box.age); //不是引用類型,無法輸出;</script>

簡而言之,堆內存存放引用值,棧內存存放固定類型值。

<script type="text/javascript">  var man = new Object();//man指向了棧內存的空間地址  man.name = "Jack";  var man2 = man;//man2獲得了man的指向地址  alert(man2.name);//兩個都彈出Jack  alert(man.name);</script>

復制變量值

再看下面這個例子:

<script type="text/javascript">  var man = new Object();//man指向了棧內存的空間地址  man.name = "Jack";  var man2 = man;//man2獲得了man的指向地址  man2.name = "ming";//因為他們都指向同一個object,同一個name,不管修改誰,大家都修改了  alert(man2.name);//兩個都彈出ming  alert(man.name);</script>

由以上可以得出:在變量復制方面,基本類型和引用類型也有所不同,基本類型復制的是值本身,而引用類型復制的是地址。

傳遞參數

ECMAScript中,所有函數的參數都是按值傳遞的,

<script type="text/javascript">   function box(num){   //按值傳遞     num+=10;     return num;   }   var num = 10;   var result = box(num);   alert(result); //如果是按引用傳遞,那么函數里的num會成為類似全局變量,把外面的number替換掉   alert(num);  //也就是說,最后應該輸出20(這里輸出10)</script>

javascript沒有按引用傳遞的,如果存在引用傳遞的話,那么函數內的變量將是全局變量,在外部也可以訪問。但這明顯是不可能的。

執行環境及作用域

執行環境是javascript中最為重要的概念之一,執行環境定義了變量或函數有權訪問其他數據。

全局執行環境是最外圍的執行環境,在web瀏覽器中,全局執行環境是window對象,因此,所有的全局變量的函數都是作為window的屬性和方法創建的。

<script type="text/javascript">   var name = "Jack";      //定義全局變量   function setName(){     return "trigkit4";   }   alert(window.name);    //全局變量,最外圍,屬于window屬性   alert(window.setName()); //全局函數,最外圍,屬于window方法</script>

當執行環境內的代碼執行完畢后,該環境被銷毀,保存其中的變量和函數也隨之銷毀,如果是全局環境,需所有程序執行完畢或網頁完畢后才會銷毀。

去掉var的局部變量

<script type="text/javascript">   var name = "Jack";   function setName(){     name = "trigkit4";  //去掉var變成了全局變量   }   setName();   alert(name);//彈出trigkit4</script>

通過傳參,也是局部變量

<script type="text/javascript">   var name = "Jack";   function setName(name){  //通過傳參,也是局部變量     alert(name);   }   setName("trigkit4");//彈出trigkit4   alert(name);//彈出Jack</script>

函數體內還包含函數,只有這個函數才可以訪問內一層的函數

<script type="text/javascript">   var name = "Jack";   function setName(){     function setYear(){  //setYear()方法的作用域在setName()內       return 21;     }   }   alert(setYear());//無法訪問,出錯 </script>

可以通過如下方法進行訪問:

<script type="text/javascript">   var name = "Jack";   function setName(){     function setYear(){  //setYear()方法的作用域在setName()內       return 21;     }     return setYear();   }   alert(setName()); //彈出21</script>

再一個作用域例子:

<script type="text/javascript">   var name = "Jack";   function setName(){     function setYear(){  //setYear()方法的作用域在setName()內       var b = "hi";   //變量b的作用域在setYear()內       return 21;     }     alert(b);//無法訪問    }</script>

當代碼在一個環境中執行的時候,就會形成一種叫做作用域鏈的東西,它的用途是保證對執行環境中有訪問權限的變量和函數進行有序訪問(指按照規則層次來訪問),作用域鏈的前端,就是執行環境的變量對象。

作用域

變量沒有在函數內聲明或者聲明的時候沒有帶var就是全局變量,擁有全局作用域,window對象的所有屬性擁有全局作用域;在代碼任何地方都可以訪問,函數內部聲明并且以var修飾的變量就是局部變量,只能在函數體內使用,函數的參數雖然沒有使用var但仍然是局部變量。

沒有塊級作用域

沒有塊級作用域

// if語句:<script type="text/javascript">if(true){            //if語句的花括號沒有作用域的功能。var box = "trigkit4";}alert(box);//彈出 trigkit4</script>


for循環語句也是如此。

變量的查詢

在變量的查詢中,訪問局部變量要比全局變量來得快,因此不需要向上搜索作用域鏈。
如下例子:

<script type="text/javascript">   var name = "Jack";   function setName(){      var name = "trigkit4";      return name; //從底層向上搜索變量  }  alert(setName());   </script>

內存問題

javascript具有自動垃圾回收機制,一旦數據不再使用,可以將其設為"null"來釋放引用

循環引用

  一個很簡單的例子:一個DOM對象被一個Javascript對象引用,與此同時又引用同一個或其它的Javascript對象,這個DOM對象可能會引發內存泄露。這個DOM對象的引用將不會在腳本停止的時候被垃圾回收器回收。要想破壞循環引用,引用DOM元素的對象或DOM對象的引用需要被賦值為null。

閉包

在閉包中引入閉包外部的變量時,當閉包結束時此對象無法被垃圾回收(GC)。

var a = function() { var largeStr = new Array(1000000).join('x'); return function() {  return largeStr; }}();

DOM泄露

當原有的COM被移除時,子結點引用沒有被移除則無法回收。

var select = document.querySelector;var treeRef = select('#tree');//在COM樹中leafRef是treeFre的一個子結點var leafRef = select('#leaf'); var body = select('body');body.removeChild(treeRef);//#tree不能被回收入,因為treeRef還在//解決方法:treeRef = null;//tree還不能被回收,因為葉子結果leafRef還在leafRef = null;//現在#tree可以被釋放了。

Timers計(定)時器泄露

定時器也是常見產生內存泄露的地方:

for (var i = 0; i < 90000; i++) { var buggyObject = {  callAgain: function() {   var ref = this;   var val = setTimeout(function() {    ref.callAgain();   }, 90000);  } } buggyObject.callAgain(); //雖然你想回收但是timer還在 buggyObject = null;}

調試內存

Chrome自帶的內存調試工具可以很方便地查看內存使用情況和內存泄露:
在 Timeline -> Memory 點擊record即可:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
北条麻妃一区二区三区中文字幕| 色哟哟网站入口亚洲精品| 国产日产欧美精品| 91久久精品视频| 亚洲欧美日韩精品久久亚洲区| 奇米一区二区三区四区久久| 国产xxx69麻豆国语对白| 亚洲国模精品一区| 最新国产精品拍自在线播放| 欧美日韩亚洲一区二区三区| 91精品中文在线| 亚洲国产精品一区二区久| 97香蕉久久夜色精品国产| 亚洲理论片在线观看| 91在线无精精品一区二区| 亚洲成色777777在线观看影院| 国产精品国产自产拍高清av水多| 国产精品福利无圣光在线一区| 精品视频在线播放| www.xxxx欧美| 欧美日韩国产一区二区三区| 欧美自拍大量在线观看| 亚洲国产精品久久91精品| 91影院在线免费观看视频| 国产精品免费网站| 国产日韩精品在线播放| 欧美激情影音先锋| 欧洲美女免费图片一区| 国产三级精品网站| 国外成人在线播放| 色综合色综合久久综合频道88| 日韩欧美国产一区二区| 日韩精品在线视频| 欧美专区福利在线| 欧美日韩精品二区| 最近2019中文免费高清视频观看www99| 欧美在线精品免播放器视频| 欧美成人自拍视频| 日韩av黄色在线观看| 国产一区二区在线播放| 亲子乱一区二区三区电影| 国产成人综合亚洲| 黑人与娇小精品av专区| 国产精品三级久久久久久电影| 欧美日韩一区二区精品| 麻豆乱码国产一区二区三区| 国产精品大陆在线观看| 夜夜嗨av色综合久久久综合网| 成人精品视频在线| 日本精品久久久久久久| 国产精品稀缺呦系列在线| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美一区二区三区四区| 91精品国产高清久久久久久91| 欧美日产国产成人免费图片| 国产成人精品久久二区二区| 97视频在线免费观看| 午夜精品蜜臀一区二区三区免费| 亚洲石原莉奈一区二区在线观看| 91黄色8090| 性欧美长视频免费观看不卡| 日韩免费在线播放| 精品视频偷偷看在线观看| 一个人www欧美| 国产成人综合精品| 国产成人精品日本亚洲| 精品性高朝久久久久久久| 欧美最猛性xxxxx(亚洲精品)| 国内精品久久久久影院 日本资源| 久久国产精品久久久| 日韩欧美精品网址| 精品国产一区二区三区久久久| 国内偷自视频区视频综合| 中文国产亚洲喷潮| 疯狂做受xxxx欧美肥白少妇| 正在播放欧美一区| 青青a在线精品免费观看| 91精品免费久久久久久久久| 好吊成人免视频| 亚洲自拍在线观看| 国产精品亚洲美女av网站| 欧美成人激情视频| 亚洲精品小视频| 欧美日韩福利在线观看| 欧美大片网站在线观看| 久久精品美女视频网站| 亚洲自拍欧美另类| 欧美成人精品三级在线观看| 亚洲精品狠狠操| 欧美日本中文字幕| 国内精品久久久久影院 日本资源| 色yeye香蕉凹凸一区二区av| yellow中文字幕久久| 国产欧美在线视频| 亚洲一区中文字幕在线观看| 91tv亚洲精品香蕉国产一区7ujn| 久久久女女女女999久久| 日韩有码片在线观看| 久久久久久久久久久久久久久久久久av| 国产成人自拍视频在线观看| 丝袜美腿精品国产二区| 国产日韩精品在线观看| 国产999精品视频| 亚洲国内高清视频| 亚洲精品福利资源站| 国产精品亚洲视频在线观看| 成人免费自拍视频| 成人午夜小视频| 久久九九免费视频| 欧美极品在线播放| 国产欧亚日韩视频| 久久久免费精品视频| www.欧美精品| 亚洲欧美激情四射在线日| 国产精品xxxxx| 国产欧美精品在线| 亚洲精品视频免费在线观看| 欧美大学生性色视频| 日韩精品电影网| www.亚洲男人天堂| 日韩第一页在线| 国产精品看片资源| 亚洲一区二区日本| 亚洲小视频在线| 日韩视频在线免费观看| 美日韩精品免费观看视频| 岛国视频午夜一区免费在线观看| 69**夜色精品国产69乱| 日韩电影第一页| 97色在线观看| 97在线视频一区| 久久av在线播放| 久久国产精品偷| 亚洲aⅴ男人的天堂在线观看| xxx成人少妇69| 国产精品久久久久久亚洲影视| 欧美精品精品精品精品免费| 美日韩精品免费观看视频| 久久久久久高潮国产精品视| 色偷偷亚洲男人天堂| 国产精品欧美日韩| 成人激情在线播放| 欧美性猛交xxxx偷拍洗澡| 国产成人精品在线| 中文字幕亚洲综合| 日韩色av导航| 精品国产自在精品国产浪潮| 国产丝袜精品视频| 狠狠躁夜夜躁久久躁别揉| 91高清视频在线免费观看| 亚洲黄色免费三级| 日本久久久久久久| 亚洲精品理论电影| 久久久久久国产精品三级玉女聊斋| 亚洲精品一区二区三区婷婷月| 91av在线视频观看| 久久久人成影片一区二区三区| 欧美激情啊啊啊| 国产精品美女主播| 国产丝袜视频一区| 96精品视频在线| 欧美日本在线视频中文字字幕| 国产精品免费小视频| 亚洲综合中文字幕在线|