JavaScript调用函数who';s name是匿名作用域中函数的in字符串
这在javascript中可行吗?我尝试调用名为“name”的变量中的函数(抱歉!)。该函数不在全局范围内JavaScript调用函数who';s name是匿名作用域中函数的in字符串,javascript,function,closures,Javascript,Function,Closures,这在javascript中可行吗?我尝试调用名为“name”的变量中的函数(抱歉!)。该函数不在全局范围内 (function () { var myFunc, name; myFunc = function(){ alert("Hi!"); }; name = "myFunc"; //myFunc(); // work (name)(); // do not work this[name](); // do
(function () {
var myFunc, name;
myFunc = function(){
alert("Hi!");
};
name = "myFunc";
//myFunc(); // work
(name)(); // do not work
this[name](); // do not work
})();
注意:我有一个JSFIDLE条目
eval
并非总是邪恶的。它确实有它的用途
如果您确实不喜欢eval,请尝试将变量存储在对象中:
(function () {
var vars = {};
vars.myFunc = function(){
alert("Hi!");
};
vars.name = "myFunc";
//vars.myFunc(); // work
vars[vars.name]();
})();
“局部作用域”没有像全局作用域那样的对象。您可以(也应该)创建自己的对象来保存您的功能:
(function () {
var name = "myFunc";
var funcs = {
myFunc: function(){
alert("Hi!");
}
};
funcs[name]();
})();
改变
到
那么这就行了:
this[name]();
演示:您几乎肯定想在这里使用对象。您能给我举个例子吗?别忘了,我的案例被简化为只显示我正在处理的问题。为什么不能先执行name=myFunc,然后执行name()?@AbhinavRanjan:因为
name
是一个字符串,可能来自其他地方。AbhinavRanjan:有时myFunc没有定义,所以我无法引用它。eval总是从全局范围调用。。。我不能用它。。我想!:-)@Jean Philipper Martin我没有评论评估。。。无论如何,我想说,eval
并不总是全局范围。尝试使用eval代码,它就会工作。@Jean-PhilippeMartin:eval
实际上在调用它的范围内运行(这就是为什么它可能很危险!)。对!!谢谢但是为什么不能像我在示例中声明的那样看到myFunc呢?我不建议这样做。在这种情况下,这个
实际上是窗口
(因为函数是在没有上下文的情况下调用的),所以这个.myFunc
只是使myFunc
全局化。(加上它在“严格模式”下无法工作)哦。。。火箭危险品你说得对。(此===窗口)为真。再说一次,我本以为不是这样的。。。我在一个匿名街区。。。为什么这是===窗口?@Jean PhilippeMartin:因为这是运行函数的上下文。当匿名函数运行时,它的上下文为null
。当函数具有null
上下文时,它将成为窗口
。请参阅:此值不是由调用设置的。由于代码未处于严格模式,因此其值必须始终为对象,因此默认为全局对象
@Rocket Hazmat:I learn daily。谢谢你回答我的问题。来自雪之门把手的回答很好,并且得到了一张赞成票,但我接受你的回答,因为它更简洁,更中肯。
myFunc = function(){
this.myFunc = function(){
this[name]();