2

別のモジュールを必要とする文字列から関数を作成したい(尋ねないでください)。

ノードインタラクティブシェルでそれを行おうとすると、すべてがうまくいき、ダンディになります。

> f = new Function("return require('crypto')");
[Function]
> f.call()
{ Credentials: [Function: Credentials],
  (...)
  prng: [Function] }

ただし、まったく同じコードをファイルに入れると、require関数は使用できないと言われます。

israfel:apiary almad$ node test.coffee 

undefined:2
return require('crypto')
       ^
ReferenceError: require is not defined
    at eval at <anonymous> (/tmp/test.coffee:1:67)
    at Object.<anonymous> (/tmp/test.coffee:2:3)
    at Module._compile (module.js:446:26)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:31)
    at Function._load (module.js:311:12)
    at Array.0 (module.js:484:10)
    at EventEmitter._tickCallback (node.js:190:38)

それを修正する方法は?

また、node.jsのコンテキスト/スコープについて何も知らないことを教えてくれます。それは何ですか?

4

1 に答える 1

2

問題は範囲です。

の引数new Function()は、グローバルスコープで評価されています。ただし、ノードは、requireインタラクティブモード/シェルのグローバルとしてのみ定義されます。それ以外の場合は、、、、などがローカル変数として定義されているクロージャrequire内で各モジュールを実行します。moduleexports

したがって、requireスコープ(クロージャ)内にあるように関数を定義するには、function演算子/キーワードを使用する必要があります:

f = function () { return require('crypto'); }

または、CoffeeScriptの->演算子:

f = -> require 'crypto'
于 2012-09-04T19:25:04.140 に答える