1. 程式人生 > >JS 模仿塊級作用域

JS 模仿塊級作用域

alert 插入 ole 表達式 函數表 var 命名 完成 out

function outputNumbers(count) {

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

    console.log(i);

  }

  var i; // 重新聲明變量

  console.log(i); // 計數

}

上述中,重復聲明了i變量,但是JS從來不會告訴你是否多次聲明了同一變量;遇到這種情況,它只會對後續的聲明視而不見

不過,它會執行後續聲明中變量的初始化。匿名變量可以用來模仿塊級作用域並避免這個問題。

(function() {

  // 這裏是塊級作用域(私有作用域)

}) ();

以上代碼定義並立即調用了一個匿名函數。將函數聲明包含在一對圓括號中,表明它是一個函數表達式。

function () {

  //這裏是塊級作用域

}(); // 出錯

上述會出錯,因為JS將function關鍵字當作一個函數聲明的開始,而函數聲明後面不能跟圓括號。要將函數聲明轉化為函數表達式,只需要加一對圓括號

無論在什麽地方,只要臨時需要一些變量,就可以使用私有作用域。

function outputNumbers (count) {

  (function () {

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

      alert(i);

    }

  })(); // 是閉包,使用塊級作用域同時減少了閉包占用內存的問題,因為沒有指向匿名函數的引用,所以一旦執行完成就會被銷毀

  alert(i); // 出錯

}

我們在for循環外部插入了一個私有作用域,在匿名函數中定義的任何變量,都會在執行結束時被銷毀。

因此,變量i只能在循環中使用,使用後即被銷毀。

而在私有作用域中可以訪問count,是因為這個匿名函數是一個閉包,它能夠訪問包含作用域中所有變量。

這種技術經常在全局作用域中被用在函數外部,從而限制向全局作用域中添加過多的變量和函數。

一般來說,我們都應該盡量少向全局作用域中添加變量和函數。

過多的全局變量和函數容易造成命名沖突

(function () {

  var now = new Date();

  if (now.getMonth() == 0 && now.getDate() == 1) {

    alert(‘Happy New Year !‘);

  }

})();

JS 模仿塊級作用域