1. 程式人生 > >JavaScript 中的匿名函數((function() {})();)與變量的作用域

JavaScript 中的匿名函數((function() {})();)與變量的作用域

asc con 匿名函數 作用域 bootstra 全局 避免 local 解釋

以前都是直接用前端框架Bootstrap,突然想看看Javascript,發現javascript是個非常有趣的東西,這裏把剛碰到的一個小問題的理解做下筆錄(廢話不多說,上代碼)。

/**
 * Example 1
 */
var localvar = "local var";
console.log(localvar);//local var

/**
 * Example 2
 */
console.log(x === undefined); // true
var x = 3;

/**
 * Example 3
 */
var myvar = "my value";
//Test01
//will return a value of undefined
(function() { console.log(myvar); // undefined var myvar = "local value"; console.log(myvar); // local value })(); console.log(myvar);//my value //Test02 (function myFunction(){ console.log(myvar);//my value })(); //Test03 var test = new function(){ console.log(myvar);//my value };

解釋如下:

(1).JavaScript 變量的特別之處是,你可以引用稍後聲明的變量而不會引發異常。這一概念稱為變量聲明提升(hoisting);

(2).JavaScript 變量感覺上是被“提升”或移到了函數或語句的頂部。然而提升後的變量將返回 undefined 值。

(3).在使用或引用某個變量之後進行聲明和初始化操作,這個被提升的引用仍將得到 undefined 值。

(4).這裏Example 3中Test01是這次問題的關鍵,Test01和Test02是很相似的(至少我看著很相似)。但是最後輸出結果不能用(1)、(2)、(3)來解釋

  經過查看官方API文檔發現,在匿名函數(function() {})();的使用中形成了閉包(重點,不清楚的可以查閱閉包的概念,閉包概念還是好理解的);

  由於閉包的存在,全局變量自然無法訪問(閉包的一個重要原因就是為了避免訪問全局變量),故Test01 function中第一句輸出結果為undefined

總結原因:匿名函數(function() {})();是一個特殊的閉包寫法。

JavaScript 中的匿名函數((function() {})();)與變量的作用域