2017-03-29 12 views
2

関数名を文字列として使用するときに関数を呼び出す方法は?例えば関数名を文字列として持つ場合、関数を呼び出してパラメータを渡すにはどうすればよいですか?

$scope.ExecuteFunction = function (func,val) { 
    // here func="GetActivityInfo" and val="ERF000000000A6543" 
    // How to Invoke function named in variable func and pass val as parameter ? 
    // GetActivityInfo(val) to be invoked. 
} 

var GetActivityInfo = function (elementId) { 
    // some code  
}; 
+0

グローバル関数は、グローバルオブジェクトのプロパティです(ブラウザ内の「ウィンドウ」)。したがって、 'window [func](val)'は、funcのかっこを持たないようにするために、 – devnull69

+0

を実行する必要があります。 – anoop

+0

'GetActivityInfo'は親関数のプライベートプロパティです。これは[closure](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)によってのみアクセスできます。 [プロパティアクセサ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors)からアクセスすることはできません。アクセス可能なオブジェクトのプロパティにする必要があります。 – georgeawg

答えて

1

機能がwindowあなたはこの使用できるの範囲内にある場合:

window[func](val); 
+0

このエラーが発生しています。 window [func]は関数ではありません – himanshu

+0

この場合、関数はウィンドウのスコープ内にありません。ロジックは機能します - あなたはちょうど正しい親を使用する必要があります。 –

0

をあなたは、この行を追加する必要があり

var test = func.apply(test,val);、それを達成するためapply() or call()を使用することができます

定義:call()かと

--->apply()あなたがthisの値を設定し、既存のオブジェクトの新しい方法としてfunctionを呼び出すことができます。 call()apply()

差:

--->()の呼び出しは、(別々に関数の引数を取り、そして適用)アレイにおける関数の引数を取ります。

<!DOCTYPE html> 
 
<html> 
 
<body> 
 

 
<p id="demo"></p> 
 

 
<script> 
 
var myObject, myArray; 
 
function myFunction(func,val) { 
 
    var test = func.apply(test,val); 
 
} 
 
function myFunction2(val) { 
 
    alert(val) 
 
} 
 
myObject = myFunction(myFunction2, ['myArray called using apply ']);  // Will return the value called from inside using `apply` 
 
document.getElementById("demo").innerHTML = myObject; 
 
</script> 
 

 
</body> 
 
</html>

上記のスニペットを実行してください

+0

@himanshu shekhar、私の答えをチェックしてください。 – Sravan

+0

は '20を返すでしょうか?また、私はこれが質問に答えるかどうかわからない、OPは関数が変数に文字列として格納されることを示した。ここに関数名を含む文字列はありません。 –

+0

@MarcCompte、ありがとう、私の謝罪、コメントは元のドキュメントから、その機能が取られたフォーム、コメントが変更されている、コメントが間違っている可能性がありますが、答えは正しいです。 :) – Sravan

0

あなたはパラメータに括弧を持っていないことを確認してください、ブラウザのコンソールに以下試してください。

function addUser(id, callback) { 
    callback(id); 
} 

function callback(id) { 
    alert(id); 
} 

addUser(1, callback); 
0

GetActivityInfoがありますその親関数のプライベートプロパティ。それはclosureによってのみアクセスできます。 property accessorでアクセスすることはできません。これは、アクセス可能なオブジェクトのプロパティを行う必要がある。

var accessibleObj = { GetActivityInfo: GetActivityInfo }; 

$scope.ExecuteFunction = function (func,val) { 
    // here func="GetActivityInfo" and val="ERF000000000A6543" 
    // How to Invoke function named in variable func and pass val as parameter ? 
    // GetActivityInfo(val) to be invoked. 
    accessibleObj[func](val); 
} 

//var GetActivityInfo = function (elementId) { 
function GetActivityInfo (elementId) { 
    // some code  
}; 

それはhoistedことができるように、上記の例では(匿名関数に初期化)プライベート変数は、プライベート関数に変更されました。

関連する問題