2009-10-08 170 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中被打破的方式,但它是一个有点太晚办的事情。

相关问题