应用function.call()后,局部变量变为全局变量

时间:2015-02-20 10:51:44

标签: javascript coffeescript

对于标题感到抱歉,我对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,但我希望20size()方法可以更改size中出现的x = () -> size变量的值,它也会更改其范围,我错了吗?

换句话说,您可以帮我改变上面的代码以便

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

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

请注意test.lines()应该是一个函数,而不是一个对象。

1 个答案:

答案 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关键字,它可以帮助您更清晰地使用此代码。