2012-06-22 125 views
0

可能有人請解釋或鏈接到資源,會告訴我爲什麼:當MYFUNC功能尚未定義在函數聲明之前定義了javascript函數的Typeof?

<script type=" type="text/javascript"> 

    if(typeof window.myfunc == "function"){ 
     alert("Why does myfunc already exist ?"); 
    } 

    function myfunc(){ 

    } 
</script> 

會彈出一個警告?

我想我在Chrome,Safari和IE(不是FF)中發現了一個與此行爲有關的問題。當包含函數的js文件在網頁中多次包含時,它使我無法擴展函數的原型。在調用它並報告錯誤之前,我想知道更多。

謝謝!

+0

當你定義功能'VAR MYFUNC =函數(){}'你會看到其中的差別。 – Amberlamps

回答

2

命名函數聲明,包括函數體,得到提升到 頂部的JavaScript範圍。我建議您閱讀this article about JavaScript scoping and hoisting

如果你做了這樣的事情,在這裏你分配的功能名爲 變量,只有變量聲明將被懸掛,但它不會有 的值,直到分配確實發生了:

if (typeof myFunc == 'function') { 
    // will not be reached 
} 

var myFunc = function() { ... } 

以上有效地得到處理,如:

var myFunc; // myFunc is undefined 

if (typeof myFunc == 'function') { 
    // will not be reached 
} 

myFunc = function() { ... } 
+0

感謝您對Wyatt的解釋。我從來沒有意識到這個問題 –

+0

謝謝Wyatt的解釋。我從來沒有意識到func = function(){}語法實際上有所不同。這解決了我的情況!因爲我運行一個web服務,當我的javascript文件包含兩次時,我的功能也被提了兩次。問題是,使用函數創建的對象(如obj = new myfunc())**之前**第二次提升函數不受函數原型的變化影響**之後**功能已被重新懸掛。很難解釋,但希望你能明白我的意思。無論如何感謝語法的提示! –