0

関数内で、別の変数関数が存在するかどうかをテストし、存在する場合はそれを呼び出す必要があります。

function div1_load(){
  // do something
}

function main(id){
  var func = id + '_load';
  if (func is function) {
    func.call();
  }
}
main('div1');

テストには2つの方法が考えられますが、どちらも避けたいeval()が関係しています。

  1. typeof eval(func)==='関数'
  2. eval('typeof(' + func +')')==='関数'

eval()を使用しない方法はありますか?そうでない場合、私の2つの方法のどちらが最も安全ですか?

4

3 に答える 3

2

関数がグローバルであると仮定すると(つまり、オブジェクトに属しているため、以下windowを確認できますtypeof

if(typeof window[id] === 'function') {  }
于 2012-06-20T12:03:25.250 に答える
2
function main(id, ns) {
    if (!ns) {
        ns = window;
    }
    if (typeof ns[id + '_load'] === "function") {
        ns[id + '_load']();
    }
}

function div1_load() {
    alert("div1_load() was called");
}

main('div1');

var test = {
    div1_load: function() {
        alert("test.div1_load() was called");
    }
};

main('div1', test);​
于 2012-06-20T12:01:32.477 に答える
1

関数がグローバル名前空間 ( window) 内で割り当てられている場合は、 を使用して、関数名の文字列が関数であるかどうかを確認できますwindow[function name] instanceof Function。(疑似) 名前空間内で割り当てられている場合は、 を使用しますSomeNamespace[function name]。つまり、関数は名前空間からプロパティ/メソッドとして取得できます (グローバル (windowブラウザでは)、またはコードで定義されています)。

function div1_load(){
  // do something
}

function main(id){
  if (window[id+'_load'] instanceof Function) {
    window[id+'_load'].call();
  }
}
main('div1')

[コメントに基づいて編集]匿名ですぐにインスタンス化された関数の場合、これは機能しません。ただし、@Florian Margaine の例は次のように調整できます。

var MyPersonalNamespace = (function() {
  function test() {}
  function main(someid) { 
     if (this[someid] instanceof Function){
       this[someid].call();
     }
  }
  return {test: test, main: main};
 }());
 MyPersonalNamespace.main('test');
于 2012-06-20T12:07:12.723 に答える