2008-09-30 182 views
35

我打電話給我的JavaScript函數。爲什麼我有時得到錯誤'myFunction is not defined'定義的?爲什麼我的JavaScript函數有時「未定義」?

例如。我偶爾會即使在這個例子中「copyArray沒有定義」:

function copyArray(pa) { 
    var la = []; 
    for (var i=0; i < pa.length; i++) 
     la.push(pa[i]); 
    return la; 
} 

Function.prototype.bind = function(po) { 
    var __method = this; 
    var __args = []; 

    // Sometimes errors -- in practice I inline the function as a workaround. 
    __args = copyArray(arguments); 

    return function() { 
     /* bind logic omitted for brevity */ 
    } 
} 

正如你所看到的,copyArray定義那裏,所以這不可能是關於哪個腳本文件加載順序。

我一直在這種情況下,更難解決的情況下,調用函數位於另一個文件中,應該應在被調用的函數之後加載。但這是我可以提出的最簡單的情況,而且似乎是同樣的問題。

它不會100%的時間發生,所以我懷疑某種加載時序相關的問題。但我不知道是什麼。

@Hojou:這是問題的一部分。我現在遇到這個錯誤的函數本身就是我的addLoadEvent,它基本上是公共庫函數的標準版本。

@詹姆斯:我明白,並且在函數中沒有語法錯誤。在這種情況下,還會報告語法錯誤。在這種情況下,我只得到'未定義'的錯誤。

@大衛:在這種情況下,腳本在於使用正常< SCRIPT SRC =「file.js」 > < /腳本>在頁的頭部部分中引用的方法的外部文件。

@Douglas:有趣的想法,但如果是這種情況,我們如何有史以來有信心調用用戶定義的函數?無論如何,我嘗試過這種方式,但它不起作用。

@sk:這項技術已經過瀏覽器測試,基本上從Prototype庫複製。

+3

只是出於好奇......在哪裏你遇到這個錯誤進出正在執行腳本的頁面幀/ IFRAME /彈出窗口? – Shog9 2008-09-30 17:11:13

+1

嗯......沒有涉及的iframe或彈出窗口。 – harpo 2008-09-30 18:49:59

回答

7

如果您只是在頁面上包含腳本,就不可能發生這種情況。

當JavaScript代碼開始執行時,無論在聲明之前還是之後聲明,「copyArray」函數都應始終可用 - 除非您使用依賴庫動態加載JavaScript文件。如果是這種情況,那麼時間上會有各種各樣的問題。

+1

我一直無法重現 - 甚至是經驗 - 這個問題,所以我會認爲這是我的錯誤。 – harpo 2009-01-04 19:41:48

4

我的猜測是,在調用方法的時候文檔不會被完全加載。在文檔準備就緒事件後讓您的代碼執行。

2

函數中的語法錯誤 - 或者上面的代碼中的語法錯誤 - 可能導致它未定義。

+4

如果是這樣的話,它將無法工作。偶爾的故障不能用語法錯誤來解釋。 – Tomalak 2008-09-30 16:49:08

0

使用匿名函數來保護您的本地符號表。喜歡的東西:

(function() { 
    function copyArray(pa) { 
     // Details 
    } 

    Function.prototype.bind = function (po) { 
     __args = copyArray(arguments); 
    } 
})(); 

這將創建一個封閉,其中包括在當地的符號表的功能,你將不必依賴於它是在全局命名空間,當你調用該函數。

2

如果你改變了內置的「功能」對象的原型很可能你正在運行到瀏覽器錯誤或競爭條件通過修改基本的內置對象。

在多個瀏覽器中測試以找出結果。

0

恐怕,當您向函數類(通過prtotyping)添加新方法時,實際上是將其添加到所有已聲明的函數,以及您的copyArray()。結果你的copyArray()函數被遞歸地自引用。即應該存在調用自身的copyArray()。bind()方法。

在這種情況下,某些瀏覽器可能會阻止您創建此類引用循環並激發「函數未定義」錯誤。

在這種情況下,內聯代碼將是更好的解決方案。

2

這不會解決你原來的問題,但你總是可以替換爲調用copyArray()

Google
__args = Array.prototype.slice.call(arguments); 

更多信息。

我已經在以下瀏覽器中測試了上述內容:IE6,7 & 8B2,Firefox 2.0.0.17 & 3.0.3,Opera 9.52,Safari for Windows 3.1.2和Google Chrome(無論最新版本在這篇文章的時間),它適用於所有瀏覽器。

+0

感謝您的提示。我可以在很多地方使用它。但是,我真的只是用這個函數作爲例子。現在困擾我的那個完全不同。 – harpo 2008-09-30 18:48:55

4

JSLint驗證您的代碼。它通常會發現很多小錯誤,所以警告「JSLint可能會傷害你的感覺」是非常有用的。 =)

20

我沒有被認識到了這個功能,如最新的Firefox定義爲Linux,雖然鉻是處理與它的罰款。

在我的情況下發生了什麼事,我有一個前SCRIPT塊,與問題定義的功能塊之前,通過以下方式提出:

<SCRIPT src="mycode.js"/> 

(也就是說,在沒有結束標記。 )

我不得不用下面的方法重新聲明這個塊。

<SCRIPT src="mycode.js"></SCRIPT> 

然後接下來的工作很好......怪異的吧?

+3

我剛剛遇到了與IE9和Chrome 14相同的問題。後面的疼痛是...... – Joshua 2011-07-12 15:55:12

0

使用框架集時會發生這種情況。在一個框架中,定義了我的變量和方法。另一方面,他們沒有。當使用調試器並查看我定義的變量時,它尤其令人困惑,然後在幀內的斷點處未定義。

2

這可能已經得到糾正,但顯然... Firefox有一個緩存的問題這是JavaScript的功能不被認可。我真的不知道具體的原因,但是,如果您清除高速緩存將修復問題(直到緩存已滿再次...不是一個很好的解決方案)。我一直在四處尋找,看看Firefox有一個真正的解決了這個,但至今沒有......哦,不是所有的版本,我想它可能只在一些3.6.x版本中,不確定...

0

我覺得你的JavaScript代碼應該放在標籤之間,有需要的文件加載

-2

請確保您的函數是不是無意中嵌套函數,也就是說,它是在處理文檔的功能定義就緒事件。

0

通過刪除「異步」負載解決:

<script type="text/javascript" src="{% static 'js/my_js_file.js' %}" async></script> 

改變:

<script type="text/javascript" src="{% static 'js/my_js_file.js' %}"></script> 
相關問題