局部变量在应用 function.call() 后变为全局变量
Local variable becomes global after applying function.call()
对不起标题,我对 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
在应用size()
方法后调用lines()
和circles()
函数时出现问题,如下所示
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 30
在最后一行,l()
returns 30
但我希望 20
。
size()
方法能够改变出现在 x = () -> size
中的 size
变量的值,它也改变了它的范围,我错了吗?
换句话说,你能帮我改一下上面的代码吗
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 20
并将 size()
方法定义保留在 lines
和 circles
函数之外?
请注意 test.lines()
应该是一个函数,而不是 object。
嗯,你将 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 函数并将 this 作为 l。如果定义了 new_size 参数,则更改 mysize。在任何情况下,都会返回 mysize。
CoffeeScript 还提供了 class 关键字,可以帮助您使这段代码更加清晰。
对不起标题,我对 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
在应用size()
方法后调用lines()
和circles()
函数时出现问题,如下所示
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 30
在最后一行,l()
returns 30
但我希望 20
。
size()
方法能够改变出现在 x = () -> size
中的 size
变量的值,它也改变了它的范围,我错了吗?
换句话说,你能帮我改一下上面的代码吗
> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 20
并将 size()
方法定义保留在 lines
和 circles
函数之外?
请注意 test.lines()
应该是一个函数,而不是 object。
嗯,你将 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 函数并将 this 作为 l。如果定义了 new_size 参数,则更改 mysize。在任何情况下,都会返回 mysize。
CoffeeScript 还提供了 class 关键字,可以帮助您使这段代码更加清晰。