2016-11-18 168 views
-2

我有以下代碼:JavaScript變量名稱相同的使用功能名稱

function a(x) { 
    return x * 2; 
} 

var a; 
alert(a); 

爲什麼警報顯示

function a(x) { 
    return x * 2 
} 

????如果我把var a = 4,警報顯示4 但是像這樣a將被識別爲函數

爲什麼會發生這種情況?

+1

你期望什麼?變量和函數在JavaScript中共享相同的名稱空間,因此它們互相覆蓋。 – Sirko

+0

@Sirko我希望a未定義 – joesid

+0

如果函數名稱和變量名稱相同,那麼JS引擎將忽略該變量。 –

回答

4

功能是類型對象這是一種

值可以存儲在變量(和屬性,並作爲參數傳遞給函數等)。

函數聲明:

  • 創建名爲函數
  • 創建與相同名稱的功能的當前範圍的變量(除非這樣的變量已經存在)
  • 分配功能
  • 已懸掛

一個var聲明:

  • 創建與指定名稱的電流範圍變量(除非該變量已經存在)
  • 懸掛
  • 不賦值給變量(除非與轉讓運營商合併)

您的聲明和var聲明均被吊銷。其中只有一個爲變量a賦值。

2

如果使用函數名稱作爲變量名稱,則其值由函數體替換。所以「var a」變成你的功能「a」,因此你的警報顯示功能「a」。

3

在JavaScript兩者函數聲明變量聲明被提升到函數的頂部,如果在功能或全局上下文的頂部限定,如果函數之外。函數聲明優先於變量聲明(但不能超過變量賦值)。

函數聲明覆蓋變量聲明升起時

首先聲明一個變量:

var a; // value of a is undefined 

二,a的值是一個函數,因爲函數聲明優先於變量聲明(但不在變量分配中):

function a(x) { 
    return x * 2; 
} 

這就是你在撥打alert(a);時所得到的結果。

但是,如果不是聲明變量,而是進行變量賦值:var a = 4;比賦值4優先。

+0

功能聲明也被提起。 – Quentin

+0

是@Quentin,但表達式不是或名稱表達式 – akinjide

+0

是@Quentin:函數聲明和變量聲明都被提升到包含範圍的頂部。函數聲明優先於變量聲明(但不能超過變量賦值)。 –

1

你應該還記得var a懸掛,這使得它更喜歡這個

var a; // placed 

function a(x) { 
    return x * 2; 
}; 

var a; // removed 
alert (a); // a is replaced by function body 

記住var a懸掛,因此,如果您分配4 to a

var a; // placed 

function a(x) { 
    return x * 2; 
}; 

var a = 4; // removed 
a = 4 // added 

alert (a); // a is now 4