CoffeeScript函数

2018-08-23 15:20 更新
在 CoffeeScript 中函数通过“->”符号来定义。以下是一个简单的函数:
hi = -> “Hello ,World!”
如果要定义一个带参数的函数,则可以这样定义:
greeting = (name) -> “Hello, #{name}!”
可见只要在’->’ 之前添加类是函数定义时的(arguments)就可以为函数提供参数,并且通过在字符串中使用 #{} 引用参数变量就可以了。
如果可能有大量参数需要传递,也可以使用 arguments 对象:
greeting = –> “Hello, #{arguments[0]}!”
Javascript 中的标准函数在 CoffeeScript 也同样是兼容的,比如 Math
cube = (num) –> Math.pow num,3
注意到函数运行时并不要求使用 () 将参数包围。
如果传递的参数并不符合逾期可以抛出异常以获取问题出现的原因。
odd = (num) ->
if typeof num is ‘number’
if num is Math.round num
if num > 0
num % 2 is 1
else
throw “#{num} is not positive”
else
throw “#{num} is not an integer”
else
throw “#{num} is not a number”
要获取到程序抛出的错误信息,直接运行函数是不行的,可以使用 try..catch 语句获取:
try
odd 5.1
catch e
console.log e
当然也可以通过使用 unless 重写 odd 函数:
odd = (num) ->
unless typeof num is ‘number’
throw “#{num} is not positive”
unless num is Math.round num
throw “#{num} is not an integer”
unless num > 0
throw “#{num} is not a number”
num % 2 is 1
如果觉得这样的格式还太长了,也可以使用类似 ruby 的语法,使用 throw A unless B 的格式编写这个函数。
函数中还可以修改变量、运行其他函数,javascript 中的函数能做到的 CoffeeScript 中的函数一样能够做到。
count = 0
anyfunc = -> count++
anyfunc()

console.log count  #now count is 1



函数声明
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。实际上变参接受的是多余参数的数组集合。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号