A CoffeeScript programozási nyelv

Függvények

Függvények

A CoffeeScript elhagyja a meglehetősen bőbeszédű function kifejezést és lecseréli a vékony nyílra. A funkciók lehetnek egysorosak vagy behúzással több sorosak is. Az utolsó kifejezés a funkcióban az implicit visszatérési érték. Más szavakkal nem kell a return kulcsszót használni, hacsak a funkción belül nem szeretnénk hamarabb visszatérni.

#CoffeeScript func = -> "bar" /* JavaScript */ var func; func = function() { return "bar"; };

A függvényeket egy opcionális paraméterlista egy nyíl és a függvény törzse definiálja. A paraméter lista a paraméterek neveit tartalmazza vesszővel elválasztva és az egészet egy zárójel veszi körbe. Az egyes paramétereknek lehetnek alapértelmezett értékei is. Ha nem null értéket adunk meg ezeknek, akkor az alapértelmezett érték lesz használva.

square = (x) -> x * x cube = (x) -> square(x) * x fill = (container, liquid = "coffee") -> "Filling the #{container} with #{liquid}..."
Függvény paraméterek

Mi a helyzet a paraméterek megadásával?

# CoffeeScript times = (a, b) -> a * b // JavaScript var times; times = function(a, b) { return a * b; };

A CoffeeScript támogatja az alapértelmezett paramétereket is, példa:

# CoffeeScript times = (a = 1, b = 2) -> a * b // JavaScript var times; times = function(a, b) { if (a == null) { a = 1; } if (b == null) { b = 2; } return a * b; };

Használhatunk nyelőket több argumentum elfogadásához a "..." -val:

# CoffeeScript sum = (nums...) -> result = 0 nums.forEach (n) -> result += n result
Függvény hívások

A funkciók ugyanúgy hívhatóak mint a JavaScript-ben: zárójelekkel, az apply() vagy a call() kifejezések segítségével. A Ruby-hoz hasonlóan, a CoffeeScript is automatikusan meghívja a funkciót ha minimum 1 argumentummal paramétereztük fel.

a = "Howdy!" alert a # megegyezik ezzel: alert(a) alert inspect a # megegyezik ezzel: alert(inspect(a))

Ha nem adunk át egy argumentumot sem a hívás során, a CoffeeScript nem tudja eldönteni, hogy a kifejezést meghívandó függvényként kezelje vagy változóként. Ebben a vonatkozásban, a CoffeeScript viselkedése eltér a Ruby-tól, amely mindig funkcióként hívja meg az hivatkozásokat. Ez egy lehetséges hibaforrás a CoffeeScript programokban, erre érdemes figyelmet szentelni, és kitenni a zárójeleket ha paraméterek nélkül szeretnénk meghívni a függvényt.

Fügvény kontextus

A kontextus váltások mindennaposak a JavaScriptben, főleg függvények callback . A CoffeeScript ennek kezelésére biztosít néhány kényelmi funkciót. Az egyik ilyen segítő funkció a =>, a kettős nyíl funkció. A kettős nyílat használva a vékony nyíl helyett, a lokális kontextus a függvény kontextushoz fog kötődni.

Egy jó példa erre az, hogy az addEventListener() callback függvénye az adott element-re hajtódik végre, így a kontextus az adott element lesz. Ha szeretnénk megtartani az eredeti kontextus a lokális kontextusban, a self = this kerülőút nélkül akkor a kettős nyíllal ezt megtehetjük. A kötés ötlete hasonló elgondolás alapján működik a jQuery proxy() vagy a ES5' bind().funkciójához.

this.clickHandler = -> alert "clicked" element.addEventListener "click", (e) => this.clickHandler(e) var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; this.clickHandler = function() { return alert("clicked"); }; element.addEventListener("click", __bind(function(e) { return this.clickHandler(e); }, this));

Az ok amikor ilyenre lehet szükségünk, az az hogy az addEventListener() callback függvénye az adott element-re hajtódik végre, így a kotextus az adott element lesz. Ha szeretnénk megtartani az eredeti kotextus a lokális kotextusban, a self = this kerülőút nélkül, a kettős nyíl egy módja ennek. A kötés ötlete hasonló elgondolás alapján működik a jQuery proxy() vagy a ES5' bind() funkciójához.

Változó számú paraméterek

Megadhatóak argumentum objektumok is a függvényeknek. Ezzel változószámú argumentumokat adhatunk meg. A függvényhíváskor is használhatjuk a ... jelölést.

gold = silver = rest = "unknown" awardMedals = (first, second, others...) -> gold = first silver = second rest = others contenders = [ "Michael Phelps" "Liu Xiang" "Yao Ming" "Allyson Felix" "Shawn Johnson" "Roman Sebrle" "Guo Jingjing" "Tyson Gay" "Asafa Powell" "Usain Bolt" ] awardMedals contenders... alert "Gold: " + gold alert "Silver: " + silver alert "The Field: " + rest