有没有什么方法可以在JavaScript中调用在另一个函数的作用域内声明的函数?

问题描述:

请告诉下方是否有可能不要使function fun成为对象的方法。有没有什么方法可以在JavaScript中调用在另一个函数的作用域内声明的函数?

(function a() { 
var fun = function() { 
console.log('abc'); 
} 
var x = 'fun'; 
// call fun using x (How ?) 
})(); 
+0

总是有'eval'。但它永远不应该用于这个。你为什么要这么做,你的[实际问题](https://meta.stackexchange.com/q/66377)是什么? – Bergi

您可以使用eval。这将评估字符串为JavaScript代码。

(function a() { 
 
var fun = function() { 
 
console.log('abc'); 
 
} 
 
var x = 'fun'; 
 

 
eval(x)(); 
 
})();

+0

这不是同一个函数,它是一个副本,但没有相同的闭包(因为在函数中有一个函数),所以它的行为不匹配,因为它不能访问相同的数据。 – Blindman67

+0

@ Blindman67你在说什么?这里没有拷贝'eval(x)()'与'fun()'的表现相同。 – Bergi

+0

@Bergi我认为答案是针对这个问题。 “访问封闭函数外部的函数”,并且给定的片段不是这个答案的意思,因为这是毫无意义的,因为已经可以访问eval所在的函数。 – Blindman67

我总是喜欢使用窗口变量来执行我的功能,而不是使用eval的,我还记得,当你使用eval一些浏览器会引发警告。另外在Chrome扩展中默认情况下不启用。

所以在我的情况下,你可以设置一个功能到Windows全局变量是这样的:

windows.x = function(){ 
    // do something here 
} 

,然后执行它像这样:

windows["x"]() 
+0

这基本上是OP要求避免(不管什么原因)的对象的一种方法。当然,使用对象将是正确的方式,但使用全局变量实际上是错误的。 – Bergi