可能重复:
What does this mean? (function (x,y)){…}){a,b); in JavaScript
我有Canvas documentation的以下JS代码:
for(var i=0;i<4;i++){
for(var j=0;j<3;j++){
ctx.beginPath();
var x = 25+j*50; // x coordinate
var y = 25+i*50; // y coordinate
var radius = 20; // Arc radius
var startAngle = 0; // Starting point on circle
var endAngle = Math.PI+(Math.PI*j)/2; // End point on circle
var anticlockwise = i%2==0 ? false : true; // clockwise or anticlockwise
ctx.arc(x,y,radius,startAngle,endAngle, anticlockwise);
if (i>1){
ctx.fill();
} else {
ctx.stroke();
}
}
}
我想把它变成CoffeeScript代码。这是:
@draw = ->
canvas = document.getElementById('canvas')
ctx = canvas.getContext('2d')
for i in [0..3]
for j in [0..2]
ctx.beginPath()
x = 25 + j * 50
y = 25 + i * 50
radius = 20
startAngle = 0
endAngle = Math.PI + (Math.PI * j) / 2
anticlockwise = if i % 2 == 0 then false else true
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)
if i > 1 then ctx.fill() else ctx.stroke()
一切都很好,但我对编译的代码有疑问:
this.draw = function() {
var anticlockwise, canvas, ctx, endAngle, i, j, radius, startAngle, x, y, _results;
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
_results = [];
for (i = 0; i <= 3; i++) {
_results.push((function() {
var _results2;
_results2 = [];
for (j = 0; j <= 2; j++) {
ctx.beginPath();
x = 25 + j * 50;
y = 25 + i * 50;
radius = 20;
startAngle = 0;
endAngle = Math.PI + (Math.PI * j) / 2;
anticlockwise = i % 2 === 0 ? false : true;
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
if (i > 1) {
_results2.push(ctx.fill());
} else {
_results2.push(ctx.stroke());
}
}
return _results2;
})());
}
return _results;
};
那么,为什么'()'括号出现在return _results2;
行之后?这并不是什么大不了的事:代码的功能很棒,但是我想知道如何消除这些圆括号,是一个完美主义者。
UPD:谢谢。现在我明白了,'()'是什么。但是,我还有一个问题:为什么会出现?
答案 0 :(得分:2)
为什么会出现?
该函数范围是CoffeeScript创建的临时变量,用于存储列表推导的值(此处为_results2
)。当循环是列表解析时,CoffeeScript总是创建这样的函数。
该函数不是绝对必要的,但它使得编译的JavaScript与CoffeeScript源(CoffeeScript的目标之一)更加1:1。例如,
arr = (i for i in [1..3])
编译到
arr = (function() { ... })();
如果没有额外的功能,你可能会有像
这样的东西var _results2 = [];
for (...) { ... }
arr = _results2;
答案 1 :(得分:0)
它定义了函数,然后立即调用它。它实际上与CoffeeScript本身无关,但这里至少还有一个参考资料,其中包含有关hows和whys的更多信息(这种用法中的命名部分纯粹是可选的):
Can I name a javascript function and execute it immediately?
答案 2 :(得分:0)
这是一个自我调用的功能。
它定义了一个函数:(function() { ... })
然后调用它而没有参数()
。
该函数返回值添加到数组return _results2;
答案 3 :(得分:0)
代码定义了一个匿名函数对象,然后调用它。
您应该看的代码如下:
(function() {
var _results2;
_results2 = [];
for (j = 0; j <= 2; j++) {
ctx.beginPath();
x = 25 + j * 50;
y = 25 + i * 50;
radius = 20;
startAngle = 0;
endAngle = Math.PI + (Math.PI * j) / 2;
anticlockwise = i % 2 === 0 ? false : true;
ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
if (i > 1) {
_results2.push(ctx.fill());
} else {
_results2.push(ctx.stroke());
}
}
return _results2;
})()
第一行定义函数对象,然后在最后一行使用()
调用。
它类似于jQuery插件,其中使用$
的代码是(function ($) { /* … */ })(jquery)
的包装。