【发布时间】:2017-07-15 13:44:07
【问题描述】:
考虑这段代码
'use strict';
var factory = () => script => eval(script);
var closure = factory();
closure('var v = 0');
var val = closure('typeof v');
console.log(val);
这是我实现它的尝试。我想创建一个闭包,然后允许用户在该闭包中创建一个新的局部变量。这可能吗?
我在某处读到“本机函数'eval'甚至可以在本地执行上下文中创建一个新变量。”。那么,为什么它在我的示例中不起作用?我的猜测是因为函数结束执行,函数结束后变量的数量不能改变,但我不确定。
我的示例脚本创建了一个闭包,并尝试在该闭包中声明和初始化新变量v,并为其分配编号0。我原以为typeof v的结果应该是number,但实际上是undefined。
所以,我有两个问题:
- 为什么不按预期创建变量
v - 如何实际实现这一点(工作示例是什么)?
【问题讨论】:
-
你到底想在这里构建什么?如何创建一个对象来存储您的上下文并向该对象添加属性,而不是尝试破解闭包。
-
为什么需要这个?我已经完成了 75% 的答案,但我意识到这看起来是多么奇怪和无用。为什么需要在这样的范围内创建新变量?请注意,每次您拨打
closure时,您都在创建一个新范围。对closure的所有调用都未“连接”。 -
@Thomas。我知道我可以使用 object 来代替,但我只是要求这种方法以便更好地了解 javascript 的工作原理。
-
@Carcigenicate。我知道它没用(或者至少我找不到它在现实世界中的用途),但我只是想了解 javascript 的工作原理
标签: javascript closures eval v8 ecmascript-2016