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这就是我要找的。谢谢,这就是我要找的。非常感谢。