10

string が与えられた場合、classnameオブジェクトのインスタンス化に使用できる、その文字列にちなんで名付けられた新しい JavaScript 関数を動的に作成したいと考えています。

使用してみましeval()たが、何らかの理由で宣言された関数がグローバル (ウィンドウ) スコープに表示されません。

eval( "function " + classname + "() {}" );
window[ classname ]; // => undefined

文字列にちなんで名付けられた新しい関数を動的に作成する方法はありますか?

または、代わりに、 を介して作成した後に、作成された関数を参照する方法を教えてくださいeval。興味深いことに、Safari でデバッグするとローカル変数として表示されます。

アップデート:

とった!もちろんeval、インスタンスを作成するためにもう一度使用するだけです。

var myInstance = eval( "new " + classname );
myInstance.constructor.name; // => classname (yay)

これは、宣言された直後にクラスのインスタンスを 1 つ作成するだけでよいため、私の場合はうまくいくはずです。ただし、一般的なケースについては、Pointyの回答を参照してください。

4

4 に答える 4

12

はい:

window[classname] = function() { ... };

正直なところ、それはあなたが試みていたものとまったく同じではありませんが、かなり近いものです. function そのような式を介して名前なしで関数をインスタンス化すると、関数は外側のスコープ (この場合はグローバル スコープ) 内の名前を介して以外はそれ自体を参照できません。

それが重要な場合、できることは次のとおりです。ストックの「内部」名で関数を作成し、それをグローバル名に割り当てます。

function secretName() { ... }

window[classname] = secretName;
于 2012-10-18T21:46:49.867 に答える
7
function registerFunction(functionBody) {
         "use strict";
         var script = document.createElement("script");
         script.innerHTML = "function " + functionBody;
         document.body.appendChild(script);
}
registerFunction("fooBar(x, y) { return x + y; }");
fooBar(1, 2); // will give you 3

これは基本的に と同じeval()ですが、現在のページのドメインに関数を登録します。後でこのスクリプト要素を削除するか、他の機能に再利用できます。

于 2012-10-18T23:22:28.390 に答える
2

これを試して:

var classname = "myFunction";

window[ classname ] = function () {};

alert( window[ classname ] ); // => undefined
于 2012-10-18T21:48:12.010 に答える
1

文字列に基づいて新しい関数を作成したくないが、別の同様の関数に基づいて作成したくない場合: (これは良い例ではないかもしれませんが、アイデアを得ることができれば幸いです)

function createListOfFunctions(functionNameList) {
  resultFunctions = {};

  // Loop all names to create a list of functions with those names
  $.each(functionNameList, function(index, functionName) {
    resultFunctions[functionName] = _createFunction(functionName);
  });

  return resultFunctions;
}

function _createFunction(name) {
  return function(anotherNameToCompare) {
    // customize this funciton whatever you like
    return name == anotherNameToCompare;
  };
}


// USAGE:
functionNameList = ['stack', 'overflow'];
result = createListOfFunctions(functionNameList); // result = { stack: function(name) {...}, overflow: function(name) {...} }

result.stack('stack'); // true
result.stack('not stack'); // false
result.overflow('overflow'); // true
于 2015-11-06T04:04:10.863 に答える