动态分配 Javascript 变量.[摆脱 eval()]

Dynamically assign Javascript variables. [Getting rid of eval()]

本文关键字:eval 摆脱 Javascript 变量 动态分配      更新时间:2023-09-26

我想改进一个小框架,因此我想摆脱对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 })()获得。