名前が変数にある場合、別の関数内で関数を呼び出すのに問題があります。
var obj = {}
obj.f = function() {
var inner = {
a: function() {
function b() {
alert('got it!');
}
b(); // WORKS AS EXPECTED
x = 'b';
[x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
}
}
inner.a();
}
obj.f();
[x]()
の前に異なるスコープパスを付けてみましたが、これまでのところ成功していません。既存の回答を検索しても何も見つかりませんでした。 this[x]()
がオブジェクト内部に直接配置されている場合は、b()
で機能します。 b()
のスコープが可変であるため、function a()
をfunction a()
内の関数として保持したいと思います。そうしないと、b()
に多くのパラメーターを渡す必要があります。
////質問の重複:Quentinは、このスレッドimoでよりエレガントな回答を提供しました。
変数の名前と一致する文字列を使用して任意の変数にアクセスする賢明な方法はありません。 (これを行う非常に貧弱な方法については、eval
を参照してください)。
[x]();
//機能しない
配列を関数として呼び出そうとしています
どちらでもない
this[x]()
この関数は、inner
オブジェクトのプロパティではありません。
window[x]()
など。
グローバルではないため、ウィンドウオブジェクトのプロパティでもありません。
文字列変数の値に基づいて関数を呼び出す必要がある場合は、関数をオブジェクトに編成し、そこから関数にアクセスします。
function b() {
alert('got it!');
}
var myFunctions = {
b: b
};
x = 'b';
myFunctions[x]();
これを試して。現在、関数変数ではなく、変数xに文字列を割り当てています。
x = b;
x();
問題はあなたの割り当てにあります
使用する x = b
の代わりに x = 'b'
関数オブジェクトを割り当てるには、後者は文字列をxに割り当てるだけです。
割り当てを修正したら、次のように関数を呼び出すことができます。
x();
a.x();
a[x]();
等.
関数の配列を作成してから、次のように変数の名前を使用してアクセスする必要があります。
var obj = {}
obj.f = function() {
var inner = {
a: function() {
// set up the possible functions:
var myFuncs = {
b: function b() {alert('got it!');}
};
//b(); // WORKS AS EXPECTED --> commented this code
x = 'b';
myFuncs[x]();
}
}
inner.a();
}
関数宣言b
は、a
として割り当てられた無名関数式のクロージャでキャプチャされます。
var
が使用されている場合、window
in グローバルスコープ。var
s name of function。Stringで変数(つまりb
)に本当にアクセスしたい場合は、b
を保持するObjectを作成する必要があります。 a
に対して行ったことと同様、または(そしておそらく危険なことに)eval
に依存して"b"
をb
に変換します。
全体を事前に作成できない場合は、この形式を使用できますObject
/* in (higher?) scope */
var fnRef = {};
// now when you
function b() {/* define as desired */}
// also keep a ref.
fnRef['b'] = b;
// fnRef['b']() will work **after this line**
あなたのコードがこのようなものだとしましょう:
//instead of x = 'b'
x = function(){}
その場合、ソリューションは次のようになります。
var obj = {}
obj.f = function() {
var inner = {
a: function() {
function b() {
alert('got it!');
}
b(); // WORKS AS EXPECTED
//you can define it as a variable
var x = function(){};
//and call it like this
x();
//or define it like this
this[x] = function(){};
//and call it like this
this[x]();
//but you are creating an array [x] which is not a function
//and you are trying to call an array????
[x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
}
}
inner.a();
}
obj.f();