1

小さなフレームワークを改善したいので、への2つの呼び出しを削除したいと思います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)

すべてが期待どおりに機能しますが、どういうわけか、これら2つはeval私を邪魔します。別の解決策があるでしょうか?

4

2 に答える 2

1

必要なビットをインポートしてみませんか?

Background = IRF.Background

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

evalEcmaScript 5では、strictモードでは新しい変数宣言を導入できないためeval('var x = ...')、strictモードでは、周囲の非評価コードから見える変数は作成されないことに注意してください。

EcmaScript5付録Cによると

厳密モードevalコードは、呼び出し元の変数環境で変数または関数をインスタンス化できませんeval。代わりに、新しい変数環境が作成され、その環境がevalコードの宣言バインディングのインスタンス化に使用されます(10.4.2)。

于 2012-04-07T20:37:11.743 に答える
1

現在のコンテキストから名前でローカル変数にアクセスする方法はありません(少なくとも、ecmascriptでは。おそらくcoffeescriptには非標準の拡張子があります)。

一部のオブジェクトのプロパティにのみアクセスできます。グローバル変数もアクセスできます。これは、グローバル変数がグローバルオブジェクトのプロパティであるためです。これはブラウザにあり、ecma-3のwindowように取得できます。(function(){ return this })()

于 2012-04-07T20:40:49.690 に答える