Javascript 闭包和咖啡脚本';s范围

Javascript 闭包和咖啡脚本';s范围,javascript,coffeescript,Javascript,Coffeescript,下面的代码定义了两个函数,行和圆,分别返回函数f和g。函数f和g仅为简单起见是相等的(()->size),但通常它们是变量size的不同函数 lines = () -> size = 10 # default value f = () -> size f.size = (_) -> size = _ f f circles = () -> size = 15 # default value g =

下面的代码定义了两个函数,
,分别返回函数
f
g
。函数
f
g
仅为简单起见是相等的(
()->size
),但通常它们是变量
size
的不同函数

lines = () ->
    size = 10 # default value
    f = () -> size
    f.size = (_) ->
      size = _
      f
    f

circles = () ->
    size = 15 # default value
    g = () -> size
    g.size = (_) ->
      size = _
      g
    g
在控制台上,上述代码产生以下模式,这正是我所需要的:

> lines()() # 10
> lines().size(20)() # 20
> circles()() # 15
> circles().size(30)() #30

正如您可能注意到的,
f.size
g.size
方法是闭包,它们在
上都是相同的。然后我的问题是:如何避免重复
size
方法的代码?(使用coffeescript或javascript)


我尝试了不同的解决方案,但没有找到正确的方法。为了复制闭包,
size
方法中的
size
变量应该引用在
的第一行定义的
size
变量(对于
),同样适用。

您可以定义一个工厂函数来生成您个人的“构造函数”:

这将编译为:

var圆、线、形状;
形状=函数(默认大小,计算){
如果(计算==null){
计算=功能(大小){
返回大小;
};
}
返回函数(){
变量f,大小;
大小=默认大小;
f=函数(){
返回计算(大小);
};
f、 大小=函数(ux){
大小=u2;;
返回f;
};
返回f;
};
};
线条=形状(10);
圆=形状(15,功能(尺寸){
返回大小*size*Math.PI;
});
console.log(行()());
console.log(行().size(20)();
console.log(circles()());

console.log(圆圈().size(30)()您可以定义一个工厂函数来生成您的单个“构造函数”:

这将编译为:

var圆、线、形状;
形状=函数(默认大小,计算){
如果(计算==null){
计算=功能(大小){
返回大小;
};
}
返回函数(){
变量f,大小;
大小=默认大小;
f=函数(){
返回计算(大小);
};
f、 大小=函数(ux){
大小=u2;;
返回f;
};
返回f;
};
};
线条=形状(10);
圆=形状(15,功能(尺寸){
返回大小*size*Math.PI;
});
console.log(行()());
console.log(行().size(20)();
console.log(circles()());

console.log(圆圈().size(30)()您不能在代码中使用helper函数,因为它无法按预期访问闭包变量。但是,您可以将整个代码包装在一个函数中,以便它分别返回
函数:

make = (def, accessor) ->
    () ->
        size = def
        f = () -> accessor size
        f.size = (_) ->
           size = _
           f
        f

lines = make 10, (size) -> size
circles = make 15, (size) -> size

您不能在代码中使用helper函数,因为它不能像预期的那样访问闭包变量。但是,您可以将整个代码包装在一个函数中,以便它分别返回
函数:

make = (def, accessor) ->
    () ->
        size = def
        f = () -> accessor size
        f.size = (_) ->
           size = _
           f
        f

lines = make 10, (size) -> size
circles = make 15, (size) -> size

你不能;构造函数变量中私有的方法闭包必须发生在构造函数中。如果您将
\u size
公开,您可以使用原型方法来实现它;构造函数变量中私有的方法闭包必须发生在构造函数中。如果您将
\u size
公开,您可以使用原型方法来实现它。
应该是“构造函数”,它们的每次调用都应该创建自己的
大小
他,现在您的解决方案看起来就像我的一样:-)+1
应该是“构造函数”,它们的每次调用都应该创建自己的
大小
he,现在您的解决方案看起来就像我的:-)+1这就是我要找的。谢谢,这就是我要找的。非常感谢。