粗談hoisting...

hoisting 中文是提升的意思。

在 javascript 中 hoisting 指的是 " 一種把宣告提升到其所在區域內頂端的行為"。

意思是,可以在宣告變數前就使用變數。

不過提升行為僅僅只針對宣告部分,對於變數的指定,並沒有跟著被提升。

看一下這小段程式碼:

var x = 5;
(function(){
  alert(x);
  var x=10;
})();
alert(x);

第一個alert會輸出 undefined,第二個是5。

第一個輸出結果不是5的原因是因為 在function中定義了一個同名的區域變數,

雖然是在後面宣告,不過變數的宣告被提升到該區域的頂端了,

當然只有宣告部分(var x),至於指定值得部分(x=10)並沒有跟著被提升。

所以會有undefined的結果。

hoisting的行為不僅是針對變數,函式也是如此。不過有一點不一樣。

函式的建立有幾種方式,一般進行hoisting時都與變數相同,宣告部分被hoisting,而指定部分則沒有被hoisting。

但有一種例外,那就是用宣告式建立的函式。

用這種方式形成的函式,不僅是宣告,連其定義也被hoisting到頂端了。

這也造成了javascript中常被提到的,函示可以先使用後宣告的特性。

下面程式碼顯示出宣告式函式特殊的hoisting行為:

x(); //輸出10
function x(){
var x=10;
alert(x);
}

提到hoisting難免要稍微提一下變數的有效範圍。

特別要一提的是javascript並沒有{}作用域的觀念,

也就是說你在if(1){var x=10;}中的x,是個全域變數。

程式碼如下:

if (1){
var x=10
}
alert(x);  //==>輸出10

如果我沒記錯的話,javascript只有在函式內才能有其所屬的作用域。

(所以在javascript中都是用函式來模擬命名空間)

還有所有沒經過var 宣告的變數,都是全域變數。

 
 

  按個讚!~支持本站!~

FB推薦載入中  

你可能會有興趣的文章