2017-05-07 4 views
0

私は配列を持つ関数に引数として渡す:JavaScriptの:変数の配列に文字列の配列に変換し、例えば、

argumentsArray = ["arg1", "arg2"]; 

そして、私は機能があります。今

function1 = function() { 
    console.log(arg1); 
    console.log(arg2); 
}; 

をもちろんfunction1を実行すると、arg1arg2が定義されていないため、エラーが発生します。

function1("string1", "string2"); 
// will log "string1" and "string2" 

しかし、問題:我々はそれには2つの引数を渡すとき

function1 = function (arg1, arg2) { 
    console.log(arg1); 
    console.log(arg2); 
}; 

今、私たちはfunction1を実行できます。しかし、私は彼らがそうのように、引数として使用したい、これらを定義する必要はありませんは、function1のソースコードを変更することはできません。私はそれの議論を編集することはできません。私はbind()apply()機能を認識してんだけど、実際に文字列を適用するため、彼らは、間違ったことをするでしょう:

getFunction1WithArgumentsFromArray = function() { 
    return function() { 
     return function1.apply(this, argumentsArray); 
    }; 
}; 

getFunction1WithArgumentsFromArray(); 
// would return function1("arg1", "arg2"); 

事は、arg1で、arg2がまだ定義されていません。彼らはまだ弦や他のものではありません。

["arg1", "arg2"] --> [arg1, arg2] 

function1 = function() { 
    console.log(arg1); 
    console.log(arg2); 
}; 

argumentsArray = ["arg1", "arg2"]; 

defineArgs = function() { 
    arg1 = "hey"; 
    arg2 = "hello"; 
}; 

getFunction1WithArgumentsFromArray = function (argumentsArray) { 
    argumentsToUse = convertArrayOfStringsToArrayOfVariables(argumentsArray); 
    // HOW??? 

    return function() { 
     return function1(argumentsToUse[0], argumentsToUse[1]); 
    }; 
    // or what should i put here??? 
}; 

getFunction1WithArgumentsFromArray(); 
// should return this: 
// function1 = function(arg1, arg2) { 
//  console.log(arg1); 
//  console.log(arg2); 
// }; 
// without executing it. 

それでは、私が本当に探していることは、これらの文字列の名前を持つ変数の配列に文字列の配列を回す機能がある:私のコードは次のようになりますJavaScriptがこれらの変数を検索するため、これを直接行うことは問題になります。私が言ったように、これらの変数が定義されていない...私が持っていた


一つの私の考えはapply()を使用してアレイにそのようなwith eval("string")秒渡すことです:これを

getFunction1WithArgumentsFromArray = function() { 
     return function() { 
      return function1.apply(
       this, 
       [eval(argumentsArray[0]), eval(argumentsArray[1])] 
      ); 
     }; 
    }; 

getFunction1WithArgumentsFromArray(); 
// would return "arg1 is not defined", because eval() executes the function as I define it 

をしてもよいです非常にあなたには非常に不必要なようですが、すでに述べたように、私はfunction1を変更することができないので、別の関数で引数リストを作成する必要があります。私はもちろん、私は変更することができますが、私が取り組んでいるプロジェクトは、引数を取得するために配列を使用しています。

+0

のように、引数にアクセスすることができますFUNCTION1したものを渡しますとき、それは間違いなく間違っているのです。この特定の苦境にはどうやって入りましたか? – deceze

+0

function1 w/argumentsオブジェクトに渡されたarguemtnsにアクセスするには、this - > arguments [index]のようにします。 arg1とarg2を定義することは不要です。 –

+3

あなたは、変数の意味と使い方について根本的な誤解があるようです。あなたの頭に立って、 'eval'や' window [varname] 'のようなものを使わなくても、文字列として変数名から変数に、あるいはその逆に変数名からマッピングすることはかなり不可能です。基本的には、コードを構造化する必要があります。名前を文字列として使用してアクセスできる名前付きの値を使用する場合は、オブジェクトとプロパティを使用します。 –

答えて

1

私が言ったように、arg1とarg2を定義することは必要ではないようです。なぜなら、オブジェクトを作成しているどこにいても、すでにそれを参照している必要があるからです。

そして、あなたはfunction1`はフラットアウトが定義されていない変数で動作するようにしようとしている `場合は、簡単にこの

function1 = function() { 
    var i; 
    for(i=0; i<arguments.length;i++){ 
    console.log(arguments[i]); // do anything with arguments[i] == arg1, arg2, 
    ... 
} 
}; 
関連する問題