console.log count #now count is 1
函數(shù)聲明
CoffeeScript的函數(shù)聲明很有意思,函數(shù)通過(guò)一組可選的圓括號(hào)包裹的參數(shù), 一個(gè)箭頭, 一個(gè)函數(shù)體來(lái)定義的。就像下面這樣:
#編譯前
square = (x) ->
x * x
//編譯后
var square;
square = function(x) {
return x * x;
};
函數(shù)體另起一行來(lái)寫(xiě),千萬(wàn)別忘了縮進(jìn)代碼,因?yàn)镃offeeScript是用縮進(jìn)來(lái)區(qū)分代碼塊的。如果你不縮進(jìn)的話,就是這個(gè)樣子的:
#編譯前
square = (x) ->
x * x
//編譯后
var square;
square = function(x) {};
x * x;
如果函數(shù)沒(méi)有參數(shù)的話,如下:
#編譯前
square = ->
x * x
#包括參數(shù)的括號(hào)可要可不要
square =() ->
x * x
//編譯后
var square;
square = function() {
return x * x;
};
多個(gè)參數(shù)用逗號(hào)隔開(kāi):
#編譯前
square = (x, y) ->
x * y
//編譯后
var square;
square = function(x, y) {
return x * y;
};
一個(gè)立即執(zhí)行的匿名函數(shù)可以這樣寫(xiě):
#編譯前
(->)()
//編譯后
(function() {})();
CoffeeScript在編譯后的函數(shù)體體會(huì)給你最后的代碼加上一個(gè)return,如果你不想要這個(gè)return值得話,可以顯式的return一個(gè)值:
#編譯前
square = (x, y) ->
x * y
return 0
//編譯后
var square;
square = function(x, y) {
x * y;
return 0;
};
函數(shù)調(diào)用
函數(shù)的調(diào)用和JavaScript的調(diào)用方式一樣:
#編譯前
str = ->
return 'xxx'
str()
//編譯后
var str;
str = function() {
return 'xxx';
};
str();
如果函數(shù)有參數(shù)的話,可以省掉括號(hào)不寫(xiě)。沒(méi)有參數(shù)的話,括號(hào)必不可少?。?br />
#編譯前
square = (x, y) ->
x * y
square 2,4
//編譯后
var square;
square = function(x, y) {
return x * y;
};
square(2, 4);
函數(shù)要先聲明,后調(diào)用!
默認(rèn)參數(shù)
一些函數(shù)函數(shù)參數(shù)會(huì)有默認(rèn)值, 當(dāng)傳入的參數(shù)的不存在時(shí)會(huì)被使用。
#編譯前
square = (x, y = 2) ->
x * y
square 3
//編譯后
var square;
square = function(x, y) {
if (y == null) {
y = 2;
}
return x * y;
};
square(3);
如果有多個(gè)參數(shù)的話,必填參數(shù)在前,默認(rèn)參數(shù)在后!大家想想為啥?
變參
JavaScript函數(shù)里可以使用arguments類數(shù)組對(duì)象獲取不定參數(shù)。CoffeeScript在函數(shù)定義和調(diào)用里提供了變參的語(yǔ)法, 讓不定個(gè)數(shù)的參數(shù)使用起來(lái)更愉悅一些。廢話不多說(shuō),看例子:
#編譯前
square = (x, y, z...) ->
#todo
square 1,2,3,4,5
//編譯后
var square,
__slice = [].slice;
square = function() {
var x, y, z;
x = arguments[0], y = arguments[1], z = 3 <= arguments.length ? __slice.call(arguments, 2) : [];
};
square(1, 2, 3, 4, 5);
變參一定要放到最后,看編譯后的代碼,第一個(gè)參數(shù)賦值給了x,第二個(gè)參數(shù)賦值給了y,剩余的參數(shù)被封裝成一個(gè)數(shù)組給了z。實(shí)際上變參接受的是多余參數(shù)的數(shù)組集合。
更多建議: