Javascript找不到从字符串转换的函数

时间:2016-03-19 03:56:09

标签: javascript

我尝试将字符串转换为函数而不使用#state = "new jersey" state.gsub!(/\b[a-z]/, &:capitalize) #state = "New Jersey" ,但每当我将函数名称传递给window对象并检查其类型时。 Javascript似乎并不认为它是一个功能。我总是收到我在else语句中定义的自定义错误消息:eval()

我的"Could not find function: 1->validateLogin"原型:

dom_ready
dom_ready: function (inputFunc) {
    document.addEventListener("DOMContentLoaded", function () {
        try {
            inputFunc();
        } catch (e) {
            DN.errors.push(e.message);
        }
    });
},

2 个答案:

答案 0 :(得分:1)

在其他答案中解决了导致问题的特定语法错误。要查找此类语法错误,请查看控制台是否存在错误。或者,通过linter运行代码。否则,每次忘记逗号时都必须发布到SO,这似乎不是一种可扩展的方法。

更基本的是,不要使用给出其名称的字符串来传递函数引用,然后您需要在窗口对象上查找。相反,只需传递函数引用本身(validateLogin)。与其他一些语言不同,JS功能是一流的公民,可以作为自己参考和传播。你的代码看起来像这样:

DN.DOM.dom_ready(function () {
  var event_ids = [
    ["#login-form-dialog", validateLogin, "submit", 1]
                           ^^^^^^^^^^^^^
  ...

  for (var i = 0; i < event_ids.length - 1; i++) {
    var fN = event_ids[i][1];

当然,您必须确保在执行此就绪功能时validateLogin可见。

但是,您有一个更基本的问题,它将阻止您的代码正常运行,如下所示:

$(event_ids[i][0]).on(event_ids[i][2], function () {
  fN(event_ids[i][3]);
})

这里,匿名函数是变量i的闭包,并且在执行时(事件发生时),i已经达到其最大值3。关于此主题有很多关于SO的问题和答案,但最简单的解决方案是使用for (let i,如果您在支持let的环境中工作。否则,请参阅this one等问题。

答案 1 :(得分:0)

event_ids中的第一项后您缺少逗号:

var event_ids = [
    ["#login-form-dialog", "validateLogin", "submit", 1], // <-- missing comma
    ["#loginnotes", "validateLogin", "click", 1],
    ["#loginnotes2", "validateLogin", "click", 2],
    ["#show-pass", "show_pass", "click", ""],
]; // <-- also it is better practice to have semi-colon here