CoffeeScript系列教程(四)—函数


函数声明

CoffeeScript的函数声明很有意思,函数通过一组可选的圆括号包裹的参数, 一个箭头, 一个函数体来定义的。就像下面这样:

#编译前
square = (x) ->
  x * x

//编译后
var square;

square = function(x) {
  return x * x;
};

函数体另起一行来写,千万别忘了缩进代码,因为CoffeeScript是用缩进来区分代码块的。如果你不缩进的话,就是这个样子的:

#编译前
square = (x) ->
x * x

//编译后
var square;    
square = function(x) {};    
x * x;

如果函数没有参数的话,如下:

#编译前
square = ->
  x * x

#包括参数的括号可要可不要
square =() ->
  x * x

//编译后
var square;    
square = function() {
  return x * x;
}; 

多个参数用逗号隔开:

#编译前
square = (x, y) ->
  x * y
//编译后
var square;

square = function(x, y) {
  return x * y;
};

一个立即执行的匿名函数可以这样写:

#编译前
(->)()

//编译后
(function() {})();

CoffeeScript在编译后的函数体体会给你最后的代码加上一个return,如果你不想要这个return值得话,可以显式的return一个值:

#编译前
square = (x, y) ->
  x * y
  return 0

//编译后
var square;

square = function(x, y) {
  x * y;
  return 0;
};

函数调用

函数的调用和JavaScript的调用方式一样:

#编译前
str = ->
  return 'xxx'

str()

//编译后
var str;

str = function() {
  return 'xxx';
};

str();

如果函数有参数的话,可以省掉括号不写。没有参数的话,括号必不可少!:

#编译前
square = (x, y) ->
  x * y

square 2,4

//编译后
var square;

square = function(x, y) {
  return x * y;
};

square(2, 4);

函数要先声明,后调用!

默认参数

一些函数函数参数会有默认值, 当传入的参数的不存在时会被使用。

#编译前
square = (x, y = 2) ->
  x * y

square 3

//编译后
var square;

square = function(x, y) {
  if (y == null) {
    y = 2;
  }
  return x * y;
};

square(3);

如果有多个参数的话,必填参数在前,默认参数在后!大家想想为啥?

变参

JavaScript函数里可以使用arguments类数组对象获取不定参数。CoffeeScript在函数定义和调用里提供了变参的语法, 让不定个数的参数使用起来更愉悦一些。废话不多说,看例子:

#编译前
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);

变参一定要放到最后,看编译后的代码,第一个参数赋值给了x,第二个参数赋值给了y,剩余的参数被封装成一个数组给了z。实际上变参接受的是多余参数的数组集合。

有任何问题,欢迎大家批评指出,我们共同进步。


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>