函数 Function

square = (x) -> x * x
cube   = (x) -> square(x) * x
var cube, square;

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

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

CoffeeScript提供了更简洁的语法来定义函数。函数定义在JavaScript中有申明式(declaration)和表达式(expression),在编译的JavaScript中,函数定义都是使用表达式来定义函数的。

//声明式
function greet(){
    console.log("hello");
}
//表达式
var greet = function(){
    console.log("Hello");
}

这两种定义函数的方法有什么区别呢?申明式的函数在声明之前就能被调用,因为JavaScript的解析器在预解析阶段就把函数声明优先读取了,保证函数能够被引用到,就是所说的”function declaration hoisting“。而表达式的函数只有在执行到那里的时候才会被读取,所以表达式的函数只能在定义之后被调用,不然会发生错误。

CoffeeScript全部使用expression的方式来定义函数,我猜应该是为了统一,从而避免“hoisting”的问题。而且统一了所有函数定义的方法,匿名的有名的都是同一种方法来定义,把一个匿名的函数赋值给一个变量就变成了有名的函数,我觉得这种处理很优雅。

还有一个值得看的的地方是编译的JavaScript的最开头,函数变量都是首先在最前面使用var声明,这个var其实就是JavaScript中的一个陷阱。

在JavaScript中,所有变量都使用var来定义,不要使用没有var的方式。在JavaScript中定义变量的时候,用不用var关键字是有区别的,不用var关键字是定义在global的scope的,使用var关键字是定义在当前的scope。关于这个scope下面还要详细讲解下。