检查字符串变量名是否是对象的javascript函数

时间:2016-06-17 08:16:27

标签: javascript function callback javascript-objects callable-object

如何检查函数中传递的字符串参数是否过于可调用/函数但不能直接在window.下。

我知道可以使用语法window['functionName']

检查open / direct callable函数

但是要在要检查的对象中声明的成员函数怎么样?

在下面的示例openFunction()可以调用,但如何调用obj1.foo()

  

不想使用eval()

示例代码:



var obj1 = {
  foo: function() {
    alert("I'm a function");
  }
}

function openFunction() {
  alert("I know i am easily callable");
}

function callSomeone(txtcallback) {
  var fn = window[txtcallback];
  if (typeof fn === 'function') {
    fn();
  }
  console.log(typeof fn);
}

callSomeone('openFunction'); //function
callSomeone('obj1.foo'); //undefined




3 个答案:

答案 0 :(得分:1)

试试这个

var obj1 = {
  foo: function() {
    alert("I'm a function");
  }
}

function openFunction() {
  alert("I know i am easily callable");
}

function callSomeone(txtcallback) {
    str =txtcallback.split(".");
    temp = window;
    for(check in str){
        temp = temp[str[check]];
         if (typeof temp === 'function') {
            temp();
            break;
         }else if(typeof temp === 'undefined'){
             break;
         }
    }
  console.log(typeof temp);
}

callSomeone('openFunction'); //function
callSomeone('obj1.foo'); //function

答案 1 :(得分:1)

如果您要在嵌套映射中查找成员,则必须使用递归方法。

function callSomeone(txtcallback) {
  var keyPath = txtcallback.split(".");
  var fn = keyPath.reduce(function (member, key) {
    return member[key];
  }, window);

  if (typeof fn === 'function') {
    fn();
  }
  console.log(typeof fn);
}

此示例的缺点是该函数在全局范围内执行。如果您需要保留容器对象的范围,则还需要保存范围。

var obj1 = {
  foo: function() {
    alert("I'm a function");
    return this;
  }
}

function openFunction() {
  alert("I know i am easily callable");
  return this;
}

function callSomeone(txtcallback) {
  var keyPath = txtcallback.split(".");

  var scope = null;

  var context = null;
  var fn = keyPath.reduce(function (member, key) {
    scope = member;
    return member[key];
  }, window);

  if (typeof fn === 'function') {
    context = fn.call(scope);
  }
  console.log(typeof fn, context);
}

callSomeone('openFunction'); //function
callSomeone('obj1.foo'); //undefined

答案 2 :(得分:1)

它返回undefined因为,您的代码等同于window["obj1.foo"],这是不正确的。

访问foo功能的正确方法是window["obj1"]["foo"]

所以你必须通过字符串obj1.foo“循环”。

这里我添加了一个GetProp函数,它执行该循环并且是递归的,因此嵌套级别不是问题。

var obj1 = {
  foo: function() {
    alert("I'm a function");
  }
}

function openFunction() {
  alert("I know i am easily callable");
}

function callSomeone(txtcallback) {
  var fn = GetProp(window, txtcallback.split("."));
  if (typeof fn === 'function') {
    fn();
  }
  console.log(typeof fn);
}

function GetProp(obj, props) {
  if(props.length == 0) {
    return obj;
  } else if(obj[props[0]] != undefined) {
    obj = obj[props[0]];
    return GetProp(obj, props.slice(1));
  }
}

callSomeone('openFunction'); //function
callSomeone('obj1.foo'); //undefined