【问题标题】:Javascript error: * is not a functionJavascript 错误:* 不是函数
【发布时间】:2009-10-08 15:50:08
【问题描述】:

我正在使用 javascript 调用已放入对象中的函数,如下所示:

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

稍后,我循环遍历这个对象并使用字符串参数调用每个函数。

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

这在 IE8 中运行良好,但在 Firefox 中会抛出错误“参数不是函数”。它使用我为字符串指定的任何变量名来执行此操作。我也试过:

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

导致“'abcdefg' 不是函数”。有谁知道这个错误是什么意思或者我为什么会得到它?

【问题讨论】:

    标签: javascript firefox function


    【解决方案1】:

    你也可以在调用前检查类型:

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

    无论如何,这可能是一个好主意,以防万一您想在某处向对象添加非功能项。

    【讨论】:

    • 这被证明是正确的解决方案,尽管从上面的帖子中并不清楚原因,所以我会详细说明。我正在创建 generatewidgets = new Array();而不是 generatewidgets = {};数组类创建了一个对象,其中包含一堆也出现在循环中的非函数属性。对我来说正确的解决方案是正确实例化对象,尽管这种解决方案在更一般的情况下可能效果更好。
    【解决方案2】:

    它在 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
    

    【讨论】:

      【解决方案3】:

      枚举对象的属性将枚举该对象的所有属性,包括您自己未设置的属性。这可能是一些在 Object.prototype 上设置内容的 JS 库的问题,因为枚举对象的属性会在原型中包含这些属性。

      我个人认为在 JavaScript 中对象枚举的设计方式是有问题的,但现在做任何事情都为时已晚。

      【讨论】:

        猜你喜欢
        • 2012-04-07
        • 2015-06-27
        • 2011-06-20
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多