1

我有一个带有函数调用的模型,util.endsWith(str, end)但我忘记导入我的 util 文件。通常我会期待一个错误,如:

cannot call method 'endsWith' of undefined或类似的东西

但我得到的错误是:

TypeError: Object #<Object> has no method 'endsWith'

这表明util已定义。我做了一个console.log,发现它和你得到的对象是同一个对象require('util')

我当然不需要 util 模块,而且我在我的文件中找不到我这样做的任何地方(不是我希望另一个文件中需要的东西在这个文件中)。

有趣的util是,仅当我从其他地方需要此模块时才定义;如果我只是运行文件,那么util是未定义的。

这是正常的吗?


我的文件并不复杂(每个文件<100 行),但我无法用一个超级基本的例子来复制它。也许它必须有几个层次。

节点 0.10.12

4

2 回答 2

2

很可能您忘记了在分配到var util的不同模块中的某个位置。util这将导致创建一个全局变量。

您可能会以这种方式泄漏更多全局变量。您可以通过执行以下操作来概览正在创建哪些全局变量:

var oldGlobalNames = Object.keys(global)

在主脚本的顶部。然后做

console.log(_.difference(Object.keys(global), oldGlobalNames))

在底部。

这使用了Underscoredifference中的函数。

或者使用https://github.com/aheckmann/gleak模块。

另一个想法:对util =. 了解util被分配到哪里。

另请参阅Node.js - 为什么在使用 mocha 和僵尸进行测试时会出现泄漏?

于 2013-07-09T16:11:55.297 回答
0

我认为这是一个 repl vs 脚本解释器的事情。当您运行 repl(nodecoffee)时,确实util可以作为预导入模块使用。但是,当您运行它们并传递脚本参数时,util不存在:

node -e 'console.log(util)'

[eval]:1
console.log(util)
            ^
ReferenceError: util is not defined
    at [eval]:1:13
    at Object.<anonymous> ([eval]-wrapper:6:22)
    at Module._compile (module.js:456:26)
    at evalScript (node.js:532:25)
    at startup (node.js:80:7)
    at node.js:901:3

但是,使用 repl:

node
> util
{ format: [Function],
  deprecate: [Function],
  print: [Function],
  puts: [Function],......
于 2013-07-09T16:27:16.853 回答