这个问题的一个例子是这样的
var bar = (function(){
function foo(){
alert("foo");
}
function test(){
var f = "foo";
// I want to run f() to run the function foo
}
})();
如果函数在全局范围内,我可以使用window["foo"]()
或命名空间window["namespace"]["foo"]()
来运行它,但是如何在示例中运行它?我不想使用eval()
。
我想要的一个非常清楚的例子是这样的:
var fns = ['a','b','c'],
bar = (function(){
function a(){
alert("a");
}
function b(){
alert("b");
}
function c(){
alert("c");
}
function test(array){
for(var i;i<array.length;i++){
//I want to run the functions that is on the array
// something like window[array[i]]() if function is in the global scope
}
}
return {
test : test
}
})();
bar.test(fns);
答案 0 :(得分:1)
您可以创建一个本地对象来引用该函数,然后像使用window
示例一样访问其属性。
var bar = (function(){
function foo(){
alert("foo");
}
var obj = {
foo: foo
};
function test(){
var f = obj["foo"];
f();
}
test();
})();
这与您在不使用eval
的情况下进入本地范围的距离非常接近。
答案 1 :(得分:-1)
您可以使用此运算符创建对象OR fn,并使其成为具有新构造函数的函数。
创建对象。
https://jsfiddle.net/0Lyrz6rm/6/
var bar = {
foo: function(){
alert("foo");
},
test: function(){
var f = "foo";
return f;
}
}
bar["foo"]();
console.log(bar["test"]());
另一种替代方法是使用构造函数定义函数并进行少量修改。
https://jsfiddle.net/0Lyrz6rm/4/
var bar = function(){
this.foo = function(){
alert("foo");
};
this.test = function(){
var f = "foo";
return f;
// I want to run f() to run the function foo
}
this.test2 = {
f: "foo"
}
}
var f = new bar();
f["foo"]();
console.log(f.test());
console.log(f.test2.f);