gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:44:24 24 4
gpt4 key购买 nike

抱歉,这个标题很困惑,因为我对 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,但我期望 20size() 方法能够更改出现在 x = () -> size 中的 size 变量的值,并且它也会更改它的范围,我错了吗?

也就是说,你能帮我修改一下上面的代码吗

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

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

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

最佳答案

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

关于javascript - 应用 function.call() 后局部变量变为全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com