编译代码中的'()'是什么?

时间:2011-11-19 23:58:22

标签: javascript coffeescript

  

可能重复:
  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:谢谢。现在我明白了,'()'是什么。但是,我还有一个问题:为什么会出现?

4 个答案:

答案 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)的包装。