为什么node.js中的非交互式Function对象中的上下文不同?

时间:2012-09-04 12:04:02

标签: javascript node.js eval require anonymous-function

我想从字符串创建一个需要另一个模块的函数(不要问)。

当我尝试在节点交互式shell中执行此操作时,一切都很好并且花花公子:

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

然而,当我在文件中放入完全相同的代码时,我被告知需要函数不可用:

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上下文/范围一无所知。那是什么?

1 个答案:

答案 0 :(得分:2)

问题在于范围。

new Function()的参数正在全球范围内进行评估。但是,Node仅将require定义为其交互模式/ shell的全局。否则,它会在closure内执行每个模块,其中requiremoduleexports等被定义为局部变量。

因此,要定义函数以使require在范围内(closure),您必须使用function operator/keyword

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

或者,CoffeeScript中的-> operator

f = -> require 'crypto'