2015-05-12 32 views
1

我認爲這樣做:的Javascript範圍古怪,功能和瀏覽器

var what = function() {}; 

function what() {} 

是JS同樣的事情,因爲功能應該是「第一類對象」 。

今天筆者瞭解到,在Firefox這個代碼:

var test = true; 
if (test) { 
    function what() { 
     alert("foo"); 
    } 
} else { 
    function what() { 
     alert("bar"); 
    } 
} 
what(); 

顯示FOO,和奇怪的原因鍍鉻顯示條...爲什麼[頭號]? 這樣做:

var test = true, what; 

    if (test) { 
     what = function() { 
      alert("foo"); 
     } 
    } else { 
     what = function() { 
      alert("bar"); 
     } 
    } 
    what(); 

解決了這個問題..爲什麼[第二]? 你可以在這裏嘗試一下http://jsfiddle.net/7cbs5gr7/

[摘要]我有兩個問題:

  1. 爲什麼Chrome和Firefox行爲方式上呢? - 另外一個:至少一個是對的? -
  2. 爲什麼在var中顯式設置函數解決了問題?
+2

我聞到吊裝的有一個古怪的問題。似乎Firefox並沒有像Chrome那樣提升功能體。在'var'中設置函數可能會迫使這種提升方式解決問題。總是提起'var'聲明的另一個好理由! –

回答

1

函數可以使用//函數語句//(ECMA-262 Edition 3標準允許的擴展名)或函數構造函數有條件地定義。請注意,ES5中不再允許這樣的函數語句。此外,此功能不能一致地跨瀏覽器工作,因此您不應該依賴它。

滾動到Conditionally defining a function

3

聲明像

what = function() { 
    alert("foo"); 
} 

function what() { 
    alert("foo"); 
} 

功能是兩回事。

在第一種情況下,變量被掛起,函數定義需要腳本執行通過ifelse中的那個點。在第二種情況下,函數只是聲明的,可以從任何地方訪問,而不管ifelse中的條件如何。

+0

在OP的例子中,函數在沒有var的情況下被聲明。 –

+0

在這種情況下,吊裝不會在那裏,但問題仍然存在。 – myTerminal

+2

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions#Conditionally_defining_a_function – Su4p