2016-09-11 1 views
-3

var文字列で関数を呼び出す必要があります。私はこの質問が以前に尋ねられたことを知ります: How to execute a JavaScript function when I have its name as a string名前が文字列であるときにJavaScript関数を実行します - 動作していません

しかし解決策は機能しません。私は間違ったことをしましたか?書かれたよう https://jsfiddle.net/puLh9keg/

// a.callThis is the function that will be called using var string 
var a = { 
    callThis: 
    function (ok, param1, param2) { 
      alert(ok + "|" + param1 + "|" + param2); 
     } 
} 

// Below is from https://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string 
function executeFunctionByName(functionName, context /*, args */) { 
    var args = [].slice.call(arguments).splice(2); 
    var namespaces = functionName.split("."); 
    var func = namespaces.pop(); 
    for(var i = 0; i < namespaces.length; i++) { 
    context = context[namespaces[i]]; 
    } 
    return context[func].apply(context, args); 
} 


// try call a.callThis by var string 
var fn = 'a.callThis'; 
executeFunctionByName(fn, window, true, 'param1', 'param2'); 
+2

あなたが何を意味を教えてください "動作していません。" –

+1

あなたのコードがどのように結果ウィンドウに追加されているのかを見てください(devツールを使用してください)。正しいJSFiddle設定を使ってこの作業を行うことができません。 –

+2

'var a'はグローバルスコープにはありません。 = ' - JSが"読み込み中 "ではなく、"本文の折り​​返しなし "または"頭の折り返しなし "で実行されていないことを確認する –

答えて

1

あなたのコードは動作します。コメントで複数の人が言及しているので、JSFiddleが機能しない理由は、あなたが操作しているグローバルスコープがwindowであるという前提で行ったことです。ただし、JSFiddle JavaScriptをonLoadに設定する必要があります。これにより、onloadハンドラにラップされます。したがって、あなたの想定に反して、コードはグローバルスコープとしてwindowで実行されていないため、動作しません。 JavaScript LOAD TYPEのオプションをNo wrap - in <head>またはNo wrap - in <body>のいずれかに変更することで、JSFiddleでコードを処理できます。

ここにはJSFiddle that has that change implementedがあります。

また、コードはスニペットで表示されていますが、正常に動作しています。

// a.callThis is the function that will be called using var string 
 
var a = { 
 
    callThis: 
 
    function (ok, param1, param2) { 
 
      alert(ok + "|" + param1 + "|" + param2); 
 
     } 
 
} 
 

 
// Below is from 
 
// http://stackoverflow.com/questions/359788 
 
//  /how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string 
 
function executeFunctionByName(functionName, context /*, args */) { 
 
    var args = [].slice.call(arguments).splice(2); 
 
    var namespaces = functionName.split("."); 
 
    var func = namespaces.pop(); 
 
    for(var i = 0; i < namespaces.length; i++) { 
 
    context = context[namespaces[i]]; 
 
    } 
 
    return context[func].apply(context, args); 
 
} 
 

 

 
// try call a.callThis by var string 
 
var fn = 'a.callThis'; 
 
executeFunctionByName(fn, window, true, 'param1', 'param2');

関連する問題