动态分配 Javascript 变量.[摆脱 eval()]
Dynamically assign Javascript variables. [Getting rid of eval()]
我想改进一个小框架,因此我想摆脱对eval
的两个调用。
让代码说话:
# irf.coffee (The Framework)
# Classes which are appended to the namespace 'IRF'
classes = [
"Background"
"BoundingBox"
# ...
]
# Namespace where to attach classes
@IRF = {}
# TODO: Get rid of eval(c)
for c in classes
@IRF[c] = eval(c)
我只希望IRF
"污染"全局命名空间,以便我可以访问像new IRF.Background()
这样的类/对象。
该框架的目标是供包括此框架在内的其他项目使用。所以我可能有这样的项目:
class TowerMap extends IRF.Game
constructor: (width, height) ->
@background = new IRF.Background(width, height)
如您所见,我必须在此处使用 IRF
命名空间,但在这个特定项目中,我想在没有命名空间的情况下使用它,因为我这样做了:
# Require all Class of IRF, so we won't need namespace here
# TODO: get rid of eval
eval("var #{k} = v") for k,v of IRF
class TowerMap extends Game
constructor: (width, height) ->
@background = new Background(width, height)
一切都按预期进行,但不知何故,这两个eval
打扰了我。可能有其他解决方案吗?
为什么不直接导入您需要的位?
Background = IRF.Background
class TowerMap extends Game
constructor: (width, height) ->
@background = new Background(width, height)
您应该知道,EcmaScript 5 严格模式下的eval
不能引入新的变量声明,因此在严格模式下eval('var x = ...')
不会产生对周围的非评估代码可见的变量。
EcmaScript 5 附录 C 说
严格模式
eval
代码无法实例化调用方变量环境中的变量或函数以eval
。而是创建一个新的变量环境,并将该环境用于eval
代码 (10.4.2) 的声明绑定实例化。
没有
办法从当前上下文中按名称访问局部变量(至少在 ecmascript 中。也许咖啡脚本有一些非标准的扩展)。
只能访问某些对象的属性。全局变量也可以访问,因为它们是全局对象的属性;这在浏览器中window
,可以在 ECMA-3 中作为(function(){ return this })()
获得。
相关文章:
- 递归使用 eval() 是检查程序执行的好方法吗?
- 为什么忽略了eval()代码中的语法错误
- 推荐在JavaScript中执行存储为字符串的函数,而不是使用eval
- Javascript eval()无法处理传递的字符串
- 调用绕过eval()的函数
- Semi-sandboxing Javascript eval
- ES6 模板文字是否比 eval 更安全
- JavaScript 可以在这里使用 eval 吗?
- 如何摆脱"压缩/块”;PHP页面底部的注释
- 如何使用uglifyjs/uglifyjs2解析walk和eval javascript表达式
- 如何使用其他地方指定的访问信息访问嵌套的json对象,而不使用eval或迭代
- 当eval只执行服务器端数据时,在javascript中使用eval是否安全
- 使用eval()定义变量显示未定义的错误
- javascript eval方法语法
- 在Javascript中使用eval的替代方案
- Eval vs execscript
- eval()读取函数参数有多糟糕
- 使用eval()设置全局变量
- 如何使eval'd调试器可访问的javascript代码
- 动态分配 Javascript 变量.[摆脱 eval()]