0

在函数内部,我需要测试是否存在另一个变量函数,如果存在则调用它。

function div1_load(){
  // do something
}

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

我可以想到两种测试方法,但都涉及我想避免的 eval() 。

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

有没有办法不使用 eval() ?如果不是,我的两种方法中哪一种最安全?

4

3 回答 3

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 回答
2

假设函数是全局的(即属于window对象,您可以检查typeof

if(typeof window[id] === 'function') {  }
于 2012-06-20T12:03:25.250 回答
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 回答