对于标题感到抱歉,我对size
变量的内容感到困惑:
size = undefined
methods = () ->
this.size = (_) ->
size = _
this
lines = () ->
size = 10 # default value
x = () -> size
methods.call(x)
x
circles = () ->
size = 15 # default value
x = () -> size
methods.call(x)
x
root.test = {
lines : lines
circles : circles
}
我编写了上述代码,仅定义size()
方法一次,然后将其添加到lines()
和circles()
函数中。
在控制台上它似乎工作
> test.lines()() #10
> test.lines().size(20)() #20
> test.circles()() #15
> test.circles().size(30)() #30
在应用lines()
方法后调用circles()
和size()
函数时会出现此问题,如下所示
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 30
在最后一行,l()
返回30
,但我希望20
。
size()
方法可以更改size
中出现的x = () -> size
变量的值,它也会更改其范围,我错了吗?
换句话说,您可以帮我改变上面的代码以便
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 20
并将size()
方法定义保留在lines
和circles
函数之外?
请注意test.lines()
应该是一个函数,而不是一个对象。
答案 0 :(得分:1)
好吧,你将size声明为全局变量,因此对象共享相同的大小。
methods = (initial_size) ->
this._mysize = initial_size
this.size = (new_size) ->
if new_size
this._mysize = new_size
this._mysize
return
l = new methods(10)
r = new methods(30)
console.log(l.size())
console.log(r.size())
l是一个方法对象,这意味着它有自己的_mysize。 r也一样。 当调用l.size()时,它调用size函数,并将其作为l。如果定义了new_size参数,则更改mysize。无论如何,都会返回mysize。
CoffeeScript还提供了class关键字,它可以帮助您更清晰地使用此代码。