如何将字符串转换为javascript函数调用(以对象为例)

如何将字符串转换为javascript函数调用(以对象为例),javascript,Javascript,是的,有很多像or这样的问题 但是,如果我们没有一个简单的函数名,而是一个对象属性名,而实际上它是一个函数呢 比如: 预期调用的代码是: window.foo = { bar: { baz: function() { alert('Eureka!'); } } }; 我需要它的原因:回调参数是通过url传递的,它可以(通过应用程序设计)是一个函数名或对象属性的FQN 除了eval(),还有其他想法吗 UPD: 我的最后执行

是的,有很多像or这样的问题

但是,如果我们没有一个简单的函数名,而是一个对象属性名,而实际上它是一个函数呢

比如:

预期调用的代码是:

window.foo = {
    bar: {
        baz: function() {
            alert('Eureka!');
        }
    }
};
我需要它的原因:回调参数是通过url传递的,它可以(通过应用程序设计)是一个函数名或对象属性的FQN

除了
eval()
,还有其他想法吗

UPD

我的最后执行:

var parts = callbackName.split('.'),
    callback;

for (i in parts) {
    if (!callback) {
        callback = window[parts[i]];
    } else {
        callback = callback[parts[i]];
    }

    if (typeof callback === 'undefined') break;
}

if (typeof callback === 'function') {
    callback();
} else {
    console.error('Passed callback is not a valid function');
}
试一试


如果这对您有效,应该很容易将
'foo.bar.baz'
转化为它。

这可能不是最优雅的方法,但应该可以:

var callMe = "foo.bar.baz".split('.');

var callMeParts = callMe.split('.');

var fnCallMe = null;
var obj = window;
for (var i = 0; i < callMeParts.length; i++) {
    var prop = callMeParts[i];
    if (typeof obj[prop] === 'undefined') break;

    if ((i + 1) === callMeParts.length && typeof obj[prop] === 'function') {
        fnCallMe = obj[prop];
        break;
    }
    obj = obj[prop];
}

if (fnCallMe !== null) {
    fnCallMe.call(obj); // Call the function using the function container as the "scope"
}
var callMe=“foo.bar.baz”.split('.');
var callMeParts=callMe.split('.');
var fnCallMe=null;
var obj=窗口;
对于(var i=0;i
查看下面的代码并查看小提琴():

window.foo={
酒吧:{
baz:function(){
警惕(“尤里卡!”);
}
}
};
//foo.bar.baz();
var callme=“foo.bar.baz”;
var fn=window[callme.split(“.”[0]]//拿第一个道具。酒吧
var len=callme.split(“.”长度//obj树的长度
对于(i=1;i
您可以随时利用

| | function(){}
用于防止对象/函数列表未定义时发生错误。如果您使用的是jQuery,那么可以将空函数文本替换为


当然,支持较旧的IEs将意味着您需要
Array.prototype.reduce()

是的,它需要。。。这很明显:-你总能联想到一个夏洛克·福尔摩斯的故事,伦敦警察厅在一所房子里找一封信,却找不到。他们把福尔摩斯带来,福尔摩斯走到书房的书桌前,拿起一个放在书桌上的信封。那是一封信。。。
window['foo']['bar']['baz']()
var callMe = "foo.bar.baz".split('.');

var callMeParts = callMe.split('.');

var fnCallMe = null;
var obj = window;
for (var i = 0; i < callMeParts.length; i++) {
    var prop = callMeParts[i];
    if (typeof obj[prop] === 'undefined') break;

    if ((i + 1) === callMeParts.length && typeof obj[prop] === 'function') {
        fnCallMe = obj[prop];
        break;
    }
    obj = obj[prop];
}

if (fnCallMe !== null) {
    fnCallMe.call(obj); // Call the function using the function container as the "scope"
}
window.foo = {
    bar: {
        baz: function() {
            alert('Eureka!');
        }
    }
};
//foo.bar.baz();
var callme = "foo.bar.baz";
var fn = window[callme.split(".")[0]];//get the first prop. bar
var len = callme.split(".").length;//length of obj tree
for(i=1;i < len;i++)
{//search for the next obj  
  fn = fn[callme.split(".")[i]];
}
if(typeof(fn) == "function")
{//check and call
  fn();
}
callMe.split('.').reduce(function(prev, value) {
    return prev[value] || function() {};
}, window)();