1. 程式人生 > >javascript之模擬塊級作用域

javascript之模擬塊級作用域

es6 匿名 重新 ror 一段 put 使用 模仿 保存

在java、C++等語言中,變量i在會在for循環的語句塊中定義,循環一旦結束,變量i就會被銷毀。可是在javaScript中,從定義開始,就可以在函數內部隨處訪問。比如

function output(){
  for(var i=0; i<10; i++){
  }
  alert(i); //10
  var i;  //重新聲明
  alert(i); //10
}

javaScript會對後續i的聲明視而不見,如果後續聲明中有變量初始化還是會執行。可以使用匿名函數來模仿塊級作用域,或者使用ES6的let命令。

用塊級作用域的匿名函數的語法如下:

(function
(){ //塊級作用域 }) ();

將函數聲明保存在一對圓括號中,表示它實際上是一個函數表達式,緊隨其後的另一個圓括號會立即調用這個函數。

function output(){
  (function(){
       for(var i=0; i<10; i++){
  }
})();
  alert(i); //error
  var i;  //重新聲明
  alert(i); //undefined
}

這種技術經常在作用域中被用在函數外部,從而限制向全局作用域中添加過多的變量和函數。js引擎讀取一段js代碼,首先預解析(這個名字我起的),就是逐行讀取js代碼,尋找全局變量和全局函數,遇到全局變量,把變量的值變為undefind,存在內存中,遇到全局函數,直接存在內存中,這個過程如果發現語法錯誤,預解析終止。限制全局作用域可以減少內存的占用。

或者使用let命令

function output(){
  for(let i=0; i<10; i++){
  var i; 
  alert(i); // undefined
}

javascript之模擬塊級作用域