局部变量在应用 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 但我希望 20size() 方法能够改变出现在 x = () -> size 中的 size 变量的值,它也改变了它的范围,我错了吗?

换句话说,你能帮我改一下上面的代码吗

> var l = test.lines().size(20)
> var r = test.circles().size(30)
> l() # 20

并将 size() 方法定义保留在 linescircles 函数之外?

请注意 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 关键字,可以帮助您使这段代码更加清晰。