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/