CoffeeScript新手在这里。我对函数的范围有一个奇怪的问题,我已将其推入数组,然后在类的成员函数中执行。基本上,似乎this
未正确设置。
class TestClass
constructor: ->
@functions = [] # my array of functions
@member = "hello there! come find me!"
update: =>
func() for func in @functions
testClass = new TestClass
testClass.functions.push( ->
str = "could i find @member? " + @member? + "; this's keys: " + Object.keys(this)
console.log(str)
)
testClass.update()
结果呢?奇怪的是,它是:
could i find @member? false; this's keys:
top,location,window,external,chrome,v8Locale,document,$,jQuery,CoffeeScript
似乎调用函数的上下文是错误的。我认为通过将一个瘦箭头函数推送到我的数组上,当调用该函数时,它将采用调用它的上下文(update
,其中this
是testClass
)
如果我这样做,一切正常:
update: =>
func.call(this) for func in @functions
但这似乎不是CoffeeScript惯用的。
答案 0 :(得分:1)
通过使用瘦箭头创建函数,您将创建一个匿名函数,其中this
将绑定到window
对象而不是它所调用的上下文。 this
不会在函数调用中保持它的值,除非这两个函数碰巧绑定到同一个上下文。
我可以通过几种方式来解决这个问题,虽然它们都不是特别难看,但它们都没有特别优雅。
首先,您提出的解决方案是在update函数中绑定函数。第二个是相似的,但将绑定移到别处:
class TestClass
...
addFunc: (func) ->
@functions.push( => func.call( @ ) )
testClass.addFunc( -> ... )
第三个选项是使用bind function from underscore.js之类的东西将函数绑定到TestClass的创建点。虽然这可能最终比其他两个选项更加混乱。