我目前正在研究CoffeeScript并遇到了烦人的问题。
当我创建写为privateMethod = ->
的类privateMethod并且如果我想在方法中使用@
a.k.a this
属性时,由于范围问题,我会收到语法错误。
请参阅下面的示例代码
class TestClass
constructor : (@name = "NoName") ->
privateFunc = ->
console.log @name
callPrivateFunc : ->
privateFunc()
testClass = new TestClass("John")
testClass.callPrivateFunc() # @name is undefined
到目前为止,我找到了避免这个问题的两种方法。
案例1:使用.call
class TestClass
constructor : (@name = "NoName") ->
privateFunc = ->
console.log @name
callPrivateFunc : ->
privateFunc.call(this)
testClass = new TestClass("John")
testClass.callPrivateFunc() # "John"
案例2:将此arg作为函数参数传递
class TestClass
constructor : (@name = "NoName") ->
privateFunc = (that)->
console.log that.name
callPrivateFunc : ->
privateFunc(@)
testClass = new TestClass("John")
testClass.callPrivateFunc() # "John"
我的问题是,这些方法是否正确使用使用this
的私有方法?
还是有任何正确的方法/事实标准?
感谢您的回答
答案 0 :(得分:0)
就“正确”的方式而言,我认为没有。使用.call对我来说更正确。这就是为什么.call存在的原因。我还要看一下Function.prototype.bind。它用于将thisArg绑定到函数。看看这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind。
.bind示例:
class TestClass
constructor : (@name = "NoName") -> privateFunc.bind(this)();
privateFunc = ->
alert @name
testClass = new TestClass("John") # alerts "John"