2011-06-20 20 views
1


私はjavascriptのような構造を持っていますが、渡された関数名を使って兄弟関数を呼び出そうとしています。
これは、これが唯一のデモ関数であることに注意してくださいのでsettimeoutを使用したクラス関数の動的関数呼び出し

function windowFactory(){ 
    this.init = function(functionName,args[]){ 
     SetTimeout(functionName(args),2000) 
    } 
    this.func1 = function(var1){ 
     alert(var1); 
    } 
    this.func2 = function(var1, var2){ 
     alert(var1+var2); 
    } 
} 
var win1 = new windowFactory(); 
win1.init("func1","hello"); 
var win2 = new windowFactory(); 
win2.init("func2","world","!"); 

..私はあなたに達成しようとするものイムの例を示しましょう説明する難しさである、構文エラー/タイプミスが含まれています。
今、私は、このことは、クラスの外にいたとき、恐ろしい評価を使用して作業していた...

eval(funcName+"('"+darray[1]+"','"+darray[2]+"')"); 

それはちょうどそれがなければならないクラスの外にあると、このようなパラメータ

答えて

1

何かのためにダミーの値で渡さ必要トリックを行う:

var windowFactory = function() { 
    var self = this; 
    this.init = function(functionName){ 
     var args = Array.prototype.slice.call(arguments, 1); 
     setTimeout(function() { 
      self[functionName].apply(self, args); 
     }, 2000); 
    }; 
    this.func1 = function(var1){ 
     alert(var1); 
    }; 
    this.func2 = function(var1, var2){ 
     alert(var1+var2); 
    }; 
}; 
var win1 = new windowFactory(); 
win1.init("func1","hello"); 
var win2 = new windowFactory(); 
win2.init("func2","world","!"); 

カスタム自己参照var self = this;に注意してください。これは、タイムアウトされた関数が呼び出されたときに、少なくともwindow(ウェブブラウザでは)thisオブジェクトがあるために使用されます。

もう一つの明確化:あなたは次の方法で行うことができますJavaScriptで特定のオブジェクトのプロパティに対処するには、次の

object.property; // Or 
object['property']; // When you have a string literal, like in your example 
+0

はありがとうございました!これはまさに私が探していたものです。これは数日間私を後押ししてきました! –

+0

驚くばかり!私は私が助けることができてうれしいです:) – Betamos

関連する問題