1. 程式人生 > >javascript中建立變數時作用域和記憶體詳解!

javascript中建立變數時作用域和記憶體詳解!

<span style="font-size:18px;">// 執行環境:定義了變數或函式有權訪問的其他資料,決定了它們各自的行為;
// 在Web瀏覽器中,全域性執行環境=window物件;
// 因此所有的全域性變數和函式都是作為window物件的屬性和方法建立的;
  var box = 'blue';             // 宣告一個全域性變數;
  function setBox(){
    console.log(box);           // 全域性變數可以在函式裡訪問;
  } 
  setBox();                 // 執行函式;
  // 全域性的變數=window物件的屬性;
  // 全域性的函式=window物件的方法;
 
// PS:當執行環境中的所有程式碼執行完畢後,該環境被銷燬,儲存在其中的所有變數和函式定義也隨之銷燬;
// 如果是在全域性環境下,需要程式執行完畢,或者網頁被關閉才會銷燬;
 
// PS:每個執行環境都有一個與之關聯的變數物件,就好比全域性的window可以呼叫全域性變數和全域性方法一樣;
// 區域性的環境也有一個類似window的變數物件,環境中定義的所有變數和函式都儲存在這個物件中;
// (我們無法訪問這個變數物件,但解析器會處理資料時後臺使用它);
  var box = 'blue';
  function setBox(){
    var box = 'red';           // 這裡是區域性變數,在當前函式體內的值是'red';出了函式體就不被認知;
    console.log(box);
  } 
  setBox();
  console.log(box);
 
// 通過傳參可以替換函式體內的區域性變數,但作用域僅限在函式體內這個區域性環境;
  var box = 'blue';
  function setBox(box){           // 通過傳參,將區域性變數替換成了全域性變數;
    alert(box);              // 此時box的值是外部呼叫時傳入的引數;=>red;
  }
  setBox('red');
  alert(box);
 
// 如果函式體內還包含著函式,只有這個內函式才可以訪問外一層的函式的變數;
// 內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境中的任何變數和函式;
  var box = 'blue';
  function setBox(){
    function setColor(){
      var b = 'orange';
      alert(box);
      alert(b);
    }
    setColor();              // setColor()的執行環境在setBox()內;
  }
  setBox();
  // PS:每個函式被呼叫時都會建立自己的執行環境;當執行到這個函式時,函式的環境就會被推到環境棧中去執行,而執行後又在環境棧中彈出(退出),把控制權交給上一級的執行環境;
 
  // PS:當代碼在一個環境中執行時,就會形成一種叫做作用域鏈的東西;它的用途是保證對執行環境中有訪問許可權的變數和函式進行有序訪問;作用域鏈的前端,就是執行環境的變數物件;

</span>

7.延長作用域鏈