web-dev-qa-db-ja.com

変数名による関数内のJavaScript呼び出し関数

名前が変数にある場合、別の関数内で関数を呼び出すのに問題があります。

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でよりエレガントな回答を提供しました。

8
Gonki

変数の名前と一致する文字列を使用して任意の変数にアクセスする賢明な方法はありません。 (これを行う非常に貧弱な方法については、evalを参照してください)。

[x](); //機能しない

配列を関数として呼び出そうとしています

どちらでもないthis[x]()

この関数は、innerオブジェクトのプロパティではありません。

window[x]()など。

グローバルではないため、ウィンドウオブジェクトのプロパティでもありません。


文字列変数の値に基づいて関数を呼び出す必要がある場合は、関数をオブジェクトに編成し、そこから関数にアクセスします。

  function b() {
    alert('got it!');
  }
  var myFunctions = {
      b: b
  };
  x = 'b';
  myFunctions[x](); 
18
Quentin

これを試して。現在、関数変数ではなく、変数xに文字列を割り当てています。

 x = b;
 x();
3
Mahesh Sapkal

問題はあなたの割り当てにあります

使用する x = b の代わりに x = 'b'関数オブジェクトを割り当てるには、後者は文字列をxに割り当てるだけです。

割り当てを修正したら、次のように関数を呼び出すことができます。

x();
a.x();
a[x]();

等.

2
user3189921

関数の配列を作成してから、次のように変数の名前を使用してアクセスする必要があります。

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();
}
2

関数宣言bは、aとして割り当てられた無名関数式のクロージャでキャプチャされます。

  1. クロージャでvarが使用されている場合、window in グローバルスコープ
  2. 関数宣言を効果的に書くvars 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**
1
Paul S.

あなたのコードがこのようなものだとしましょう:

//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();
1
Mehran Hatami