官网文档传送门
CoffeeScript简介
CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展示 JavaScript 优秀的部分.
CoffeeScript 的指导原则是: “她仅仅是 JavaScript”. 代码一一对应地编译到 JS, 不会在编译过程中进行解释. 已有的 JavaScript 类库可以无缝地和 CoffeeScript 搭配使用, 反之亦然. 编译后的代码是可读的, 且经过美化, 能在所有 JavaScript 环境中运行, 并且应该和对应手写的 JavaScript 一样快或者更快.
换而言之,CoffeeScript只是将JS给简化,使得JS的编码更加人性化。虽然CoffeeScript编译出来的JS看起来并不简单,但CoffeeScript编写的时候确实会减少不少代码量。具体可参照后文的例子。
CoffeeScript安装
CoffeeScript可以通过npm安装和管理。首先你要安装nodeJS,然后通过以下命令安装:
npm install -g coffee-script
coffee命令使用
安装之后, 你应该可以运行 coffee
命令以执行脚本, 编译 .coffee 文件到 .js 文件, 和提供一个交互式的 REPL. coffee
命令有下列参数:
参数 | 作用 |
---|---|
-c, –compile | 编译一个 .coffee 脚本到一个同名的 .js 文件 |
-m, –map | 随 JavaScript 文件一起生成 source maps. 并且在 JavaScript 里加上 sourceMappingURL 指令 |
-i, –interactive | 启动一个交互式的 CoffeeScript 会话用来尝试一些代码片段. 等同于执行 coffee 而不加参数. |
-o, –output [DIR] | 将所有编译后的 JavaScript 文件写到指定文件夹. 与 –compile 或 –watch 搭配使用. |
-j, –join [FILE] | 编译之前, 按参数传入顺序连接所有脚本到一起, 编译后写到指定的文件. 对于编译大型项目有用. |
-w, –watch | 监视文件改变, 任何文件更新时重新执行命令. |
-p, –print | JavaScript 直接打印到 stdout 而不是写到一个文件. |
-s, –stdio | 将 CoffeeScript 传递到 STDIN 后从 STDOUT 获取 JavaScript. 对其他语言写的进程有好处. 比如:cat src/cake.coffee coffee -sc |
-l, –literate | 将代码作为 Literate CoffeeScript 解析. 只会在从 stdio 直接传入代码或者处理某些没有后缀的文件名需要写明这点. |
-e, –eval | 直接从命令行编译和打印一小段 CoffeeScript. 比如:coffee -e "console.log num for num in [10..1]" |
-b, –bare | 编译到 JavaScript 时去掉顶层函数的包裹. |
-t, –tokens | 不对 CoffeeScript 进行解析, 仅仅进行 lex, 打印出 token stream: [IDENTIFIER square] [ASSIGN =] [PARAM_START (] … |
–nodejs | node 命令有一些实用的参数, 比如--debug , --debug-brk , --max-stack-size , 和 --expose-gc . 用这个参数直接把参数转发到 Node.js. 重复使用 --nodejs 来传递多个参数. |
-n, –nodes | 不对 CoffeeScript 进行编译, 仅仅 lex 和解析, 打印 parse tree: |
Expressions
Assign
Value "square"
Code "x"
Op *
Value "x"
Value "x"
函数
函数体组成
coffee的函数通过一组可选的圆括号包裹的参数, 一个箭头, 一个函数体来定义
square = (x) -> x * x
等同于
square = function(x) {
return x * x;
};
返回值
函数体的最后一条表达式会作为返回值返回。
无参数情况
如果不需要参数,则可以省略参数列表,表示为
square = -> 'empty'
相当于
square = function() {
return 'empty';
};
多参数和默认值
如果需要多个参数,只需要按(参数1,参数2…)的形式写就好。
参数可以设置默认值,例如
add = (x = 4, y = 3) -> x + y
add 5
等同于
add = function(x, y) {
if (x == null) {
x = 4;
}
if (y == null) {
y = 3;
}
return x + y;
};
add(5);
闭包表示
函数还有另一种表示方法,就是用=>
代替->
,两者的区别在于前者会解释成闭包函数
square = (x) => x * x
解释为:
square = (function(_this) {
return function(x) {
return x * x;
};
})(this);
变参
使用 JavaScript 的 arguments 对象是一种处理接收不定数量个参数的函数常用办法. CoffeeScript 在函数定义和调用里提供了变参(splats) ...
的语法, 让不定个数的参数使用起来更愉悦一些.
gold = silver = rest = "unknown"
awardMedals = (first, second, others...) ->
gold = first
silver = second
rest = others
contenders = [
"Michael Phelps"
"Liu Xiang"
"Yao Ming"
"Usain Bolt"
]
awardMedals contenders...
alert "The Field: " + rest
解释为: