92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

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

2016-10-26    藍藍設計的小編

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

 

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

 

1)值類型:數值、布爾值、null、undefined
2)引用類型:對象、數組、函數。
 
如果賦值的是引用類型的值,則必須在堆內存中為這個值分配空間。由于這種值的大小不固定(對象有很多屬性和方法),因此不能把他們保存到棧內存中。但內存地址大小是固定的,因此可以將內存地址保存在棧內存中。
 
<script type="text/javascript”>
var box = new Object();  //創建一個引用類型
var box = "trigkit4";   //基本類型值是字符串
box.age = 21;    //基本類型值添加屬性很怪異,因為只有對象才可以添加屬性。
alert(box.age);  //不是引用類型,無法輸出;
</script>
 
簡而言之,堆內存存放引用值,棧內存存放固定類型值?!耙谩笔且粋€指向對象實際位置的指針。

在這里需注意的是,引用指向的是具體的對象,而不是另一個引用。

6aa5ac5dede866494318b109fae59bc4.jpeg

 

 

 這里的對象可以是字符串對象,數字對象,數組對象等

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

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

執行環境及作用域

執行環境是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>
 

每個環境都可以向上搜索作用域鏈,以查詢變量和函數名;但任何環境都不能通過向下搜索作用域鏈而進入另一個執行環境。在這里,如果去掉var name = "trigkit4",那么將彈出“Jack”

內存問題

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即可:

 

藍藍設計www.skdbbs.com )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計  cs界面設計 、 ipad界面設計  包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務 

 

日歷

鏈接

個人資料

藍藍設計的小編 http://www.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
自拍偷拍亚洲区| 57pao国产成人免费| 中文字幕亚洲字幕| 国产一区二区三区高清在线观看| 久久久最新网址| 国产成人av在线播放| 琪琪亚洲精品午夜在线| 亚洲成人三级在线| 久久久亚洲网站| 国产精品高潮在线| 久久久久久久一| 欧美一区三区三区高中清蜜桃| 日韩精品黄色网| 日韩精品免费在线观看| 欧美限制级电影在线观看| 久久久免费观看| 日韩在线www| 亚洲aa中文字幕| 欧美一级免费看| 亚洲网在线观看| 26uuu亚洲伊人春色| 在线观看国产欧美| 久久久人成影片一区二区三区| 久久久女女女女999久久| 欧美国产日韩在线| 国产成人aa精品一区在线播放| 亚洲国产精品va在线看黑人动漫| 中国人与牲禽动交精品| 国产午夜精品久久久| 欧洲永久精品大片ww免费漫画| 国产成人高清激情视频在线观看| 国产精品视频一区二区三区四| 欧美日韩中文字幕| 欧美在线一级视频| 亚洲xxxx在线| 欧美精品激情blacked18| 亚洲成人国产精品| 亚洲二区在线播放视频| 欧美成人免费全部观看天天性色| 久久久女女女女999久久| 成人97在线观看视频| 庆余年2免费日韩剧观看大牛| 午夜精品视频网站| 欧美大片va欧美在线播放| 成人黄色免费在线观看| 性色av一区二区三区| 欧美成人国产va精品日本一级| 亚洲人成77777在线观看网| 91精品久久久久久久久久| 亚洲free性xxxx护士hd| 精品欧美激情精品一区| 日韩免费观看高清| 国产日本欧美一区二区三区| 久久中国妇女中文字幕| 亚洲视频在线免费看| 亚洲第一精品夜夜躁人人躁| 欧美裸体男粗大视频在线观看| 欧美日韩亚洲91| 欧美精品www在线观看| 另类视频在线观看| 亚洲人成电影网| 久热在线中文字幕色999舞| 亚洲精品美女在线| 久久成年人视频| 成人免费自拍视频| 亚洲视频网站在线观看| 国产精品一区二区3区| 欧美精品18videosex性欧美| 久久精品亚洲94久久精品| 中文字幕无线精品亚洲乱码一区| 欧美成人精品h版在线观看| 九九久久久久久久久激情| 亚州av一区二区| 国产视频精品久久久| 久久久久亚洲精品成人网小说| 91精品成人久久| 色综合视频网站| 亚洲欧美一区二区三区在线| 欧美黄色免费网站| 欧美中文字幕视频| 色偷偷91综合久久噜噜| 色综合久久88色综合天天看泰| 97碰碰碰免费色视频| 久久精品国产久精国产一老狼| 欧美亚洲第一区| 久久这里只有精品视频首页| 亚洲午夜激情免费视频| 一本大道久久加勒比香蕉| 久久亚洲精品国产亚洲老地址| 欧美精品一二区| 久久人人爽人人爽爽久久| 欧美成人免费播放| 91在线看www| 国产精品日韩欧美大师| 日本最新高清不卡中文字幕| 粉嫩老牛aⅴ一区二区三区| 精品视频在线播放免| 亚洲国产精彩中文乱码av| 日韩极品精品视频免费观看| 亚洲视频欧美视频| 91久久在线观看| 国产成人一区二区三区小说| 2018国产精品视频| 北条麻妃久久精品| 亚洲国产精彩中文乱码av在线播放| 欧美精品电影在线| 一本一本久久a久久精品牛牛影视| 国产精品aaa| 乱亲女秽乱长久久久| 成人免费网站在线| 久久精品91久久久久久再现| 国产成人精品最新| 精品久久久久国产| 亚洲自拍偷拍福利| 国产精品视频男人的天堂| 国产激情久久久久| 国产精品久久久久不卡| 日韩精品欧美激情| 色妞在线综合亚洲欧美| 日本午夜在线亚洲.国产| 亚洲亚裔videos黑人hd| 久久97精品久久久久久久不卡| 亚洲理论在线a中文字幕| 亚洲欧美激情四射在线日| 91精品久久久久久久久久久| 97超碰国产精品女人人人爽| 色综合亚洲精品激情狠狠| 久久大大胆人体| 日韩成人av在线播放| 精品视频在线播放色网色视频| 欧美疯狂做受xxxx高潮| 国产精品99免视看9| 亚洲高清福利视频| 亚洲最大的网站| 久久99精品国产99久久6尤物| 久久男人av资源网站| 国产亚洲精品久久| 久久久久久91| 亚洲精品免费av| 日本在线精品视频| 久久久久久久影视| 亚洲国产欧美精品| 国产精品美女免费看| 9.1国产丝袜在线观看| 国产精品麻豆va在线播放| 欧美日韩国产一区二区| 国产精品网站视频| 久久人人爽亚洲精品天堂| 中文字幕在线视频日韩| 亚洲欧美成人一区二区在线电影| 欧美中文字幕在线播放| 色偷偷9999www| 国产精品老女人精品视频| 欧美插天视频在线播放| 超碰97人人做人人爱少妇| 国产极品jizzhd欧美| 在线国产精品视频| 亚洲成人免费网站| 精品国产一区av| 亚洲小视频在线观看| 国产精品xxx视频| 夜色77av精品影院| 欧美贵妇videos办公室| 中文字幕欧美日韩va免费视频|