1

我想改进一个小框架,因此我想摆脱对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打扰了我。可能有另一种解决方案吗?

4

2 回答 2

1

无法从当前上下文中按名称访问局部变量(至少在 ecmascript 中。也许咖啡脚本有一些非标准扩展名)。

只能访问某个对象的属性。全局变量也可以被访问,因为它们是全局对象的属性;它window在浏览器中,可以像(function(){ return this })()在 ecma-3 中一样获得。

于 2012-04-07T20:40:49.690 回答
1

为什么不只导入您需要的位?

Background = IRF.Background

class TowerMap extends Game
  constructor: (width, height) ->
    @background = new Background(width, height)

您应该知道,eval在 EcmaScript 5 中,严格模式不能引入新的变量声明,因此eval('var x = ...')在严格模式下不会生成对周围的非 eval 代码可见的变量。

EcmaScript 5 附录 C

严格模式eval代码无法将调用者的变量环境中的变量或函数实例化为eval. 相反,会创建一个新的变量环境,并将该环境用于eval代码 (10.4.2) 的声明绑定实例化。

于 2012-04-07T20:37:11.743 回答