2016-05-23 18 views
2

最近、私は、私はそれが余分なのparam &が作る供給でプログラムのparamさんと一緒に関数呼び出しを持っていたボタンのonclickのをATTRIBにアクセスするために必要な関数型キャストはJavaScript

Extract & call JavaScript function defined in the onclick HTML attribute of an element(using jQuery attr/prop)

質問に求めていました関数呼び出し(onclick=doSomething(2,4))。

しかし、私はapply/callの使用も余分に供給する便利来ることができることを把握param's.Forこのように私はそれが私が試した

arr[1] = 'doSomething'; 

ような文字列にしていた属性&から関数名を抽出関数コンストラクタを使用してこれを関数として扱いますが、機能しません (Function(arr[1])など)どうしてですか?

解決策Javascript: interpret string as object reference?が問題なく動作します。しかし、なぜそれが関数コンストラクタによって達成できないのでしょうか?この場合、機能

いくつかのコード情報

var funDef  ='doSomething'; // this is the name of real function defined in the script 
var funcName = new Function(funDef); //expected it to return reference of function doSomething,shows function anonymous() in console 

    var funcArgs = [5,7,10]; 
    funcName.apply('',funcArgs); //this is the function call. 

は私が

var funcName = new Function(funDef); with var funcName = eval(funDef); 

感謝を交換は、それまでは呼び出されません。

+0

'新しいFunction'コンストラクタは'のeval() 'のように動作します。だから、 '新機能(ARR [1] + "()");'働くかもしれません。 –

+1

フィドルを共有してください.... – Rayon

+0

@NiettheDarkAbsolどのように追加のパラメータを渡すのですか? –

答えて

0

私はnew Function(..)コンストラクタは、私が期待していた方法での参照を返すように関数全体の体を必要としていることを理解し、そこからJavaScriptのチャットルームでこれを議論しました。

関数コンストラクタは、evalの間にスクリプトに記述されたdoSomething関数の定義を考慮しません。このシナリオに収まることができ

他の方法はここにある:

Javascript use variable as object name

コメント?

1

new Functionevalは互換性がありません。あなたが評価するとすぐに実行されるコードを作成しています。 Functionを作成すると、自分で実行できる関数が返されます。

それはあなたがほとんどかのようだ:あなたのコードの多くを示した場合は、私たちが何かを提案することができ

// This executes 1+2 
 
var resultOfEval = eval('1+2'); 
 
// This creates a function that when called, returns 1+2 
 
var resultOfWrappedEval = eval('(function(){return 1+ 2})'); 
 
// This is much like the line above, you have to call it for it to execute 
 
var resultOfFunctionCtor = new Function('return 1+ 2;'); 
 

 

 
console.log('resultOfEval', resultOfEval); 
 
console.log('resultOfWrappedEval', resultOfWrappedEval); 
 
console.log('executing resultOfWrappedEval', resultOfWrappedEval()); 
 
console.log('resultOfFunctionCtor', resultOfFunctionCtor); 
 
console.log('executing resultOfWrappedEval', resultOfFunctionCtor());

が、キーは、コードをFunctionコンストラクタを呼び出すときということですすぐに実行されない場合は、新しく作成された関数への参照を返します。

また、あなたが機能を自分で呼び出すことができることを理解しているようです。それをすることで何が問題になりますか?

+0

はい、私はすぐに実行するとは思っていませんでしたが、 'var funcName'が' doArrArs [1] 'から文字列として抽出している 'doSomething'関数の参照を取得することを期待しました。 .slice(0、arrArgs [1] .indexOf( '('))これはdoSomethingを返します。関数への呼び出しは 'funcName.apply( ''、funcArgs);です。 –

+0

は、 'var funcName = new Function(arrArgs [1] .slice(0、arrArgs) 'のようになります。 (1).indexOf( '('))); '名前を正しく取得しても関数を参照していません。 ' –

+0

毎回異なる動的パラメータが存在するため、onclick属性を抽出する必要があります。 –