JavaScript 新函数作用域 ReferenceError

Posted

技术标签:

【中文标题】JavaScript 新函数作用域 ReferenceError【英文标题】:JavaScript new Function scope ReferenceError 【发布时间】:2015-04-19 22:57:36 【问题描述】:

有什么方法可以让下面的代码正常工作吗?

(function()
    var n = "abc";
    (new Function("return alert(n);"))();
)();

如果我在浏览器中运行代码,结果是:“Uncaught ReferenceError: n is not defined”。

另外,我还需要在“新函数”中也可以访问一些其他变量,例如“n”。

请帮忙, 谢谢

【问题讨论】:

在这种情况下你为什么要使用new Function? MDN documentation 中有一个大大的黄色注释,​​不容忽视:"注意: 使用 Function 构造函数创建的函数不会为其创建上下文创建闭包;它们总是在全局范围内创建。[...]" 【参考方案1】:

所以你需要将变量设为全局变量。

(function()
    window.n = "abc";
    (new Function("return alert(n);"))();
)();

【讨论】:

【参考方案2】:

当您使用new Function 方法(顺便说一下,类似于eval)时,您的代码将在全局 范围内执行! n 只存在于那个匿名函数中,它不是全局的。

除非 100% 必要,否则您不应使用 new Function

(function()
    var n = "abc";
    (function()return alert(n);)();
)();

附: alert 返回undefined 所以return alert() 没有做任何有用的事情。

【讨论】:

以上是关于JavaScript 新函数作用域 ReferenceError的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript的作用域和上下文

javaScript-闭包与作用域

javaScript--浅谈闭包

javaScript闭包

JavaScript的作用域链

全新Java入门到架构师教程之JavaScript函数作用域和内置对象