【问题标题】:Undefined is not a function error with "defined" argument未定义不是带有“已定义”参数的函数错误
【发布时间】:2014-07-19 19:59:27
【问题描述】:

所以这是处理 xmlhttprequest 的简单 JavaScript 代码的一部分。产生错误的部分在底部(else if):

    httpReq.onreadystatechange = function(){
        if (httpReq.readyState == 4) {
            if (httpReq.status == 200) {
                var strRes = httpReq.responseText;
                if(xmlOrig) strRes = (new $Xml(strRes, true)).conteudo(xmlOrig);
                if(elemDest) $id(elemDest).innerHTML = strRes;
                if(func) {
                    var dadosArray = new Array(4, strRes, httpReq, 'OK', 'Concluído com sucesso.');
                    window[func](dadosArray);
                }
            } else {
                if(elemDest) elemDest.innerHTML = 'Erro: '+httpReq.status+' | '+httpReq.statusText;
                if(func) {
                    var dadosArray = new Array(4, false, httpReq, 'erro', 'Erro, conteúdo não carregado!');
                    window[func](dadosArray);
                }
            }
        } else if(func){
            console.log("func? "+typeof(func));
            var dadosArray = new Array(httpReq.readyState);
            window[func](dadosArray);  // <-- HERE IS THE ERROR!
        }
    }

但是,console.log 将“func”参数作为函数返回,那么错误在哪里?

Safari 控制台:

功能?功能 TypeError: 'undefined' 不是函数(评估 'windowfunc')

【问题讨论】:

  • 你在哪里定义变量func是什么?您没有在任何地方传递或定义它?
  • 我在根目录下定义了一个测试函数。首先,我虽然这是函数内部的错误,但测试函数无关(作为测试)。我认为 Safari 无法准确定位可能是一个错误。
  • 找到了:func必须是String,所以不能定义func = Function,而是func = "NameOfTheFunction"。

标签: javascript function evaluation


【解决方案1】:

您确定func 在窗口上吗?您正在检查func,它可以在任何范围内,然后您可以调用window.func()

【讨论】:

  • 由于 typeof(func) 正在返回“function”,我假设该函数已正确定义,并且我在根目录中定义了它。
  • 答案:func必须是String,所以不能定义func = Function,而是func = "NameOfTheFunction"。
【解决方案2】:

您可能打算使用window["func"] 而不是window[func]

后一个表达式等价于window["function(someParam) { ... }"](即,无论func 的实际内容是什么)。 window 可能没有名称为 func 的整个字符串化文本内容的属性。

【讨论】:

  • 该函数不称为“func”。我使用 func = "doNothing" 作为测试,并且 function = doNothing(d){ } 在根中定义。
  • 我找到了。只要你的想法不是答案,它给了我一个不同的想法:func必须是一个String,所以我不能定义func = Function,而是func = "NameOfTheFunction"。
  • @GustavoPinent 保存函数的变量的名称称为func,您可以通过字符串"func" 在括号语法中通过名称识别该变量。概括这两种情况:window["someString"] 指的是全局变量someString,而window[someVar] 指的是一个名为的内容 someVar 的全局变量。如果someVar 设置为"foo",那么window[someVar] 指的是全局foo
  • 好的,但是在这种情况下,我希望指向一个函数来接收响应,所以 window[func] 将完成这项工作(我必须选择)。问题是如果 func 存在但没有带有函数名称的字符串,Safari 会返回一个通用的“未定义”错误。 IMO Safari 应返回与无法在此上下文中评估的参数相关的适当错误消息。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 2014-09-18
相关资源
最近更新 更多