2009-10-08 171 views
0

我使用JavaScript來調用已投入的對象,像這樣的功能:後來JavaScript錯誤:*是不是一個函數

generatewidgets['mywidget'] = function (mystring) { code } 

,我遍歷這個對象,然後調用了每個函數字符串參數。

argument = 'abcdefg'; 
for (this.key in generatewidgets) 
    generatewidgets[this.key](argument); 

這工作正常在IE8,但在Firefox中拋出一個錯誤「參數不是一個函數」。它使用我爲字符串指定的任何變量名進行此操作。我也試過:

generatewidgets[this.key](argument+''); 

這導致「'abcdefg'不是函數」。任何人都知道這個錯誤意味着什麼或爲什麼我得到它?

回答

1

您也可以在呼叫前檢查類型:

for (var key in generatewidgets) { 
    if (typeof generatewidgets[key] === 'function') 
    generatewidgets[key](argument); 
} 

這可能是一個好主意,反正萬一某處在路上你想添加一個非功能項目到對象。

+0

這被證明是正確的解決方案,雖然原因是不能從後上方清楚,所以我會指定更多。我正在創建generatewidgets = new Array();而不是generatewidgets = {};數組類創建一個對象,其中有一些非函數屬性也出現在循環中。對我來說正確的解決方案是正確地實例化對象,雖然這個解決方案在更一般的情況下可能更好。 – Travis 2009-10-08 16:19:35

0

它的工作在Firefox 3.5的我。這是我的測試:

>>> var generatewidgets = {}, argument = 'abcdefg'; 
>>> generatewidgets['mywidget'] = function(mystring) { console.log(mystring); } 
function() 
>>> for (this.key in generatewidgets) generatewidgets[this.key](argument); 
abcdefg 
0

枚舉對象的屬性將枚舉超過全部該對象的屬性,包括您自己沒有設置的屬性。這可能是一些JS庫設置Object.prototype的問題,因爲枚舉對象的屬性將在原型中包含這些屬性。

我個人認爲,對象枚舉被設計在JavaScript中被打破的方式,但它是一個有點太晚辦的事情。

相關問題