2016-03-19 8 views
-1

文字列を関数eval()を使用せずに関数に変換しようとしていますが、関数名をウィンドウオブジェクトに渡してその型をチェックするときは常にそうです。 Javascriptはそれを関数として認識していないようです。私はいつも私がelse文で定義したこのカスタムエラーメッセージを受け取る:"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); 
     } 
    }); 
}, 

function show_pass() { 
    ... 

} 

function validateLogin(k) { 
    ... 
} 
DN.DOM.dom_ready(function() { 
var event_ids = [ 
    ["#login-form-dialog", "validateLogin", "submit", 1] 
    ["#loginnotes", "validateLogin", "click", 1], 
    ["#loginnotes2", "validateLogin", "click", 2], 
    ["#show-pass", "show_pass", "click", ""], 
] 

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

    var fN = window[event_ids[i][1]]; 


    if (typeof fN === 'function') { 

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

    } else { 
     console.log("Could not find function: " + i + "->" + event_ids[i][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 
+0

ありがとうございます。もう少し注意を払う時間。 –

+0

この段階では、コンマが見つからないIDEを誰も使用していないとは思えません。私はWebStorm(コストのお金)、Sublime Text(試してみると無料ですが、お金を払うことなく無期限に使うことができます)、Atom(無料ですが時々バギー)を使いました。 – Andrew

+0

問題がタイプミスである場合は、入力ミスとして閉じるように投票し、おそらくコメントを残します。あなたが本当に答えを出したいのであれば、カンマを忘れるたびに彼がほとんど来ないので、OPに自分のタイプミスを見つける方法を教えてください。 –

1

特定の構文エラーました他の回答に記載されています。このような構文エラーを見つけるには、コンソールでエラーを調べます。または、リンターを介してコードを実行します。それ以外の場合は、カンマを忘れるたびに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になります。このトピックに関する多くの質問と回答がここにありますが、最も簡単な解決策は、for (let iを使用することですそれはletをサポートします。それ以外の場合は、this oneのような質問を参照してください。

関連する問題