当其名称在变量中时,我很难调用另一个函数内的函数:
var obj = {}
obj.f = function() {
var inner = {
a: function() {
function b() {
alert('got it!');
}
b(); // WORKS AS EXPECTED
x = 'b';
[x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
}
}
inner.a();
}
obj.f();
我尝试为[x]()
添加不同范围路径的前缀,但到目前为止还没有成功。搜索现有答案并未发现任何问题。如果this[x]()
直接放在对象内部,它可以与b()
一起使用。由于b()
中的范围可变,我希望将function a()
保留为function a()
内的函数,否则我需要将许多参数传递给b()
。
//// 重复问题:Quentin在这个帖子imo中提供了一个更优雅的答案。
答案 0 :(得分:16)
使用匹配变量名称的字符串,没有合理的方法来访问任意变量。 (对于一个非常糟糕的方法,请参阅eval
)。
[x]();
//不工作
您正在尝试将数组作为函数调用
不需要
this[x]()
该函数不是inner
对象的属性。
window[x]()
等
由于它不是全局的,因此它也不是窗口对象的属性。
如果需要根据字符串变量的值调用函数,则在对象中组织函数并从中访问它们。
function b() {
alert('got it!');
}
var myFunctions = {
b: b
};
x = 'b';
myFunctions[x]();
答案 1 :(得分:3)
试试这个。目前,您将字符串分配给变量x,而不是函数变量。
x = b;
x();
答案 2 :(得分:2)
问题在于您的作业
使用x = b
代替x = 'b'
来分配函数对象,因为后者只是将字符串赋值给x。
修复作业后,您可以调用该函数
x();
a.x();
a[x]();
等
答案 3 :(得分:2)
您应该为该函数创建数组,然后使用变量中的name进行访问,如下所示:
var obj = {}
obj.f = function() {
var inner = {
a: function() {
// set up the possible functions:
var myFuncs = {
b: function b() {alert('got it!');}
};
//b(); // WORKS AS EXPECTED --> commented this code
x = 'b';
myFuncs[x]();
}
}
inner.a();
}
答案 4 :(得分:1)
函数声明 b
将在分配为a
的匿名函数表达式的闭包中捕获。
var
时,没有(在 JavaScript 中可用) Object ,它被赋予类似于{{ 1}}在全局范围中。 window
函数的名称 。如果您确实想要通过 String 访问变量(即var
),则需要创建一个 Object ,其中包含{{1}与您为b
所做的相似,或者(并且可能危险地)依靠b
将a
转换为eval
。
如果您无法提前创建整个对象,则可以使用此格式
"b"
答案 5 :(得分:1)
让我们说你的代码是这样的:
//instead of x = 'b'
x = function(){}
然后你的解决方案可能是这样的:
var obj = {}
obj.f = function() {
var inner = {
a: function() {
function b() {
alert('got it!');
}
b(); // WORKS AS EXPECTED
//you can define it as a variable
var x = function(){};
//and call it like this
x();
//or define it like this
this[x] = function(){};
//and call it like this
this[x]();
//but you are creating an array [x] which is not a function
//and you are trying to call an array????
[x](); // DOESN'T WORK, NEITHER this[x]() window[x](), etc.
}
}
inner.a();
}
obj.f();