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

Local variable becomes global after applying function.call()

本文关键字:全局变量 应用 function call 局部变量      更新时间:2024-02-29

对不起标题,我对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()返回30但我希望20.size() 方法能够更改出现在 x = () -> size 中的size变量的值,并且它还更改其范围,我错了吗?

换句话说,您能否帮助我更改上面的代码,以便拥有

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

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

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

好吧,您将大小声明为全局变量,因此对象共享相同的大小。

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 关键字,这将帮助您使这段代码更清晰。