foo.coffee:

class Foo
  constructor: ->
    console.log BAR

module.exports = Foo


主咖啡:

BAR = 1

class Bar
  constructor: ->
    console.log BAR

new Bar()

Foo = require './foo'
new Foo()


然后

$ coffee main.coffee
1
ReferenceError: BAR is not defined


为什么在BAR实例内部不能访问Foo
我可以使它对Foo对象“可见”(除了将其显式传递给构造函数之外)?

最佳答案

我认为问题在于,在CoffeeScript中,当您声明一个变量时,总是将其编译为局部变量。

因此,在上面的声明中,当您执行BAR=1时,它将被编译为var BAR=1。因此,变量始终在本地作用域,这意味着其他模块无法访问该变量。

因此,Jed Schneider为您提供的解决方案是正确的,在Node.js中只有一个警告,当您在模块中时,this引用指向module.exports对象而不是global Jed似乎建议使用object对象(这是node.js和浏览器之间混淆的根源,因为在浏览器中它的行为确实与Jed解释的一样)。

所以,这永远是真的

//module.js
console.log(this==module.exports) //yield true


而在函数中,this关键字将指向全局对象。因此,这也是正确的:

//module.js
(function(){
   console.log(this==global); //yields true
})()


在这种情况下,要解决您的问题,可以使用Jed Schneider方法,但请确保将代码包装在IIFE中,以便您的this指向global而不是module.exports

因此,这将产生您的预期结果:

do ->
   @BAR = 1

   class Bar
      constructor: ->
         console.log BAR

   new Bar()
   Foo = require './foo'
   new Foo()


这产生输出

1
1

关于javascript - module.exports和外部范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24284428/

10-12 06:37