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