軟體測試學習教程——WEB測試之JS記憶體

千鋒教育官方發表於2019-09-11

  WEB測試之JS記憶體


  Js的記憶體


  執行環境及作用域


  執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。


  全域性執行環境是最外圍的執行環境。在Web瀏覽器中,全域性執行環境被認為是window物件。因此所有的全域性變數和函式都是作為window物件的屬性和方法建立的。


  var box='blue';


  function setBox(){


  alert(box);


  }


  setBox();


  全域性的變數和函式,都是window物件的屬性和方法。


  var box='blue';


  function setBox(){


  alert(window.box);


  }


  window.setBox();


  當執行環境中的所有程式碼執行完畢後,該環境被銷燬,儲存在其中的所有變數和函式定義也隨之銷燬。如果是全域性環境下,需要程式執行完畢,或者網頁被關閉才會銷燬。


  PS:每個執行環境都有一個與之關聯的變數物件,就好比全域性的window可以呼叫變數和屬性一樣。區域性的環境也有一個類似window的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。(我們無法訪問這個變數物件,但解析器會處理資料時後臺使用它)


  函式里的區域性作用域裡的變數替換全域性變數,但作用域僅限在函式體內這個區域性環境。


  var box='blue';


  function setBox(){


  varbox='red';


  alert(box);


  }


  setBox();


  alert(box);


  透過傳參,可以替換函式體內的區域性變數,但作用域僅限在函式體內這個區域性環境。


  var box='blue';


  function setBox(box){


  alert(box);


  }


  setBox('red');


  alert(box);


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


  var box='blue';


  function setBox(){


  functionsetColor(){


  var b='orange';


  alert(box);


  alert(b);


  }


  setColor();


  }


  setBox();


  每個函式被呼叫時都會建立自己的執行環境。當執行到這個函式時,函式的環境就會被推到環境棧中去執行,而執行後又在環境棧中彈出(退出),把控制權交給上一級的執行環境。


  PS:當程式碼在一個環境中執行時,就會形成一種叫做作用域鏈的東西。它的用途是保證對執行環境中有訪問許可權的變數和函式進行有序訪問。作用域鏈的前端,就是執行環境的變數物件。


  沒有塊級作用域


  塊級作用域表示諸如if語句等有花括號封閉的程式碼塊,所以,支援條件判斷來定義變數。


  if(true){


  varbox='zhang';


  }


  alert(box);


  for迴圈語句也是如此


  for(var i=0;i<10;i++){


  varbox='Lee';


  }


  alert(i);


  alert(box);


  var關鍵字在函式里的區別


  function box(num1,num2){


  varsum=num1+num2;


  returnsum;


  }


  alert(box(10,10));


  alert(sum);


  一般確定變數都是透過搜尋來確定該識別符號實際代表什麼。


  var box='blue';


  function getBox(){


  returnbox;


  }


  alert(getBox());


  記憶體問題


  JavaScript具有自動垃圾收集機制,執行環境會負責管理程式碼執行過程中使用的記憶體。其他語言比如C和C++,必須手工跟蹤記憶體使用情況,適時的釋放,否則會造成很多問題。而JavaScript則不需要這樣,它會自行管理記憶體分配及無用記憶體的回收。


  JavaScript最常用的垃圾收集方式是標記清除。垃圾收集器會在執行的時候給儲存在記憶體中的變數加上標記。然後,它會去掉環境中正在使用變數的標記,而沒有被去掉標記的變數將被視為準備刪除的變數。最後,垃圾收集器完成記憶體清理工作,銷燬那些帶標記的值並回收他們所佔用的記憶體空間。


  垃圾收集器是週期性執行的,這樣會導致整個程式的效能問題。比如IE7以前的版本,它的垃圾收集器是根據記憶體分配量執行的,比如256個變數就開始執行垃圾收集器,這樣,就不得不頻繁地執行,從而降低的效能。


  一般來說,確保佔用最少的記憶體可以讓頁面獲得更好的效能。那麼最佳化記憶體的最佳方案,就是一旦資料不再有用,那麼將其設定為null來釋放引用,這個做法叫做解除引用。這一做法適用於大多數全域性變數和全域性物件。


  var o={


  name:‘zhang’


  };


  o=null;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69914734/viewspace-2656718/,如需轉載,請註明出處,否則將追究法律責任。

相關文章