我正在尝试为Atom文本编辑器编写一个包,在我的主类(init.coffee)中,我的module.exports中有一个数组:
servers: []
我想从module.exports的另一部分中的函数访问这个数组,但是我遇到了麻烦。
功能:
stas: () ->
dir = getFilePath()
d = fs.statSync dir
if !d.isDirectory()
dirError dir
else
s = new Server dir
s.init()
@servers.push s
return
我一直收到这个错误:
Uncaught TypeError: this.servers.push is not a function
我这样称呼函数:
@events.add atom.commands.add ".tree-view", {
'atom-together:startServer': @stas
'atom-together:startClient': @stac
'atom-together:stopServer': @stos
'atom-together:stopClient': @stoc
}
在coffeescript中调用此数组的正确方法是什么?
答案 0 :(得分:3)
JavaScript / CoffeeScript函数中this
(AKA @
)的值通常取决于它的调用方式,而不是它的定义位置。此外,@stas
只是对stas
函数的引用,而this
将是调用者在调用该函数时所希望的内容。
如果您在回调函数中需要特定的@
(AKA this
),请将其定义为bound function:
stas: () => # Note the => instead of ->
#...
或在将其传递给事件系统时使用Function.prototype.bind
绑定它:
@events.add atom.commands.add ".tree-view", {
'atom-together:startServer': @stas.bind(@)
#...
}
另外,如果您在课程级别定义servers: []
,请执行以下操作:
class C
servers: []
然后你在所有类的实例中共享那个servers
数组,这可能不是你想要的。在类级别定义的内容通过所有实例中的原型共享。例如:
class C
a: [ ]
c1 = new C
c2 = new C
c1.a.push 11
console.log c1.a, c2.a
会在控制台中放置两个[11]
,因为c1.a
和c2.a
是相同的数组。您通常最好在constructor
中定义可变值以避免此共享(除非您特别希望它发生);这个版本:
class C
constructor: (@a = [ ]) ->
c1 = new C
c2 = new C
c1.a.push 11
console.log c1.a, c2.a
会在控制台中为您提供[11]
和[]
,而这通常是您正在寻找的行为。