2011-11-19 167 views
4

可能重複:
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:謝謝。現在我明白了,'()'是什麼。但是,我仍然有一個問題:爲什麼會出現?

回答

2

爲什麼會出現?

功能的作用域是CoffeeScript的創建存儲列表理解(在這裏,_results2)的值的臨時變量。當循環是列表理解時,CoffeeScript總是創建這樣一個函數。

這個函數並不是絕對必要的,但它使編譯後的JavaScript與CoffeeScript源(CoffeeScript的目標之一)更爲1:1。例如,

arr = (i for i in [1..3]) 

編譯成

arr = (function() { ... })(); 

,而沒有額外的功能,你反而會碰到這樣的

var _results2 = []; 
for (...) { ... } 
arr = _results2; 
0

這是一個自我調用功能。

它定義一個函數:(function() { ... }),然後不帶參數()調用它。

該函數返回值添加到數組return _results2;

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)包裝在一起。

相關問題