📅  最后修改于: 2023-12-03 14:59:58.481000             🧑  作者: Mango
CoffeeScript 是一种编译成 JavaScript 的编程语言,它在语法上的一些改动让代码更加简洁易读。在 CoffeeScript 中,函数是一个很重要的概念。
在 CoffeeScript 中,定义函数使用 ->
符号。例如:
multiply = (x, y) -> x * y
这个函数接受两个参数 x
和 y
,并返回它们的乘积。在 JavaScript 中,这个函数的代码为:
var multiply;
multiply = function(x, y) {
return x * y;
};
在 CoffeeScript 中,定义函数的快捷方式是使用 =>
符号,称为“fat arrow”。定义一个使用 this
的回调函数时,=>
是非常有用的。
class MyClass
constructor: ->
@myArray = [1, 2, 3]
printWithDelay: ->
setTimeout => console.log(val), 1000 for val in @myArray
这个例子中,当 setTimeout
函数被调用时,this
不再是原来的上下文,而是当前对象的引用。在 JavaScript 中,这个方法通常是这样定义的:
class MyClass {
constructor() {
this.myArray = [1, 2, 3];
}
printWithDelay() {
var _this = this;
setTimeout(function() {
console.log(val);
}, 1000);
}
}
CoffeeScript 中的默认参数非常简洁明了。例如:
greet = (name = "World") -> "Hello, #{name}!"
如果我们不传递 name
参数,name
将会是 "World"
。
当我们需要将一个变量中的所有参数传递给另一个函数时,Rest 参数是非常有效的。
sum = (numbers...) ->
numbers.reduce (x, y) -> x + y
这个函数接受任意数量的参数,并返回它们的总和。
在 CoffeeScript 中,函数的最后一个语句将自动成为返回值。
sum = (x, y) ->
x + y
这个函数与下面的 JavaScript 等效:
var sum;
sum = function(x, y) {
return x + y;
};
带有 =>
符号的函数通常被称为“箭头函数”。箭头函数不会创建自己的上下文,而是使用当前上下文。例如:
class Person
constructor: (@name) ->
greet: ->
setTimeout => console.log("Hello, #{@name}!"), 1000
上面这个例子中,greet
方法使用 setTimeout
函数在一秒钟后打印出一条问候信息。由于箭头函数的使用,我们可以在 setTimeout
的回调函数内部直接使用 @name
,而不需要将 this
存储到另一个变量中。
CoffeeScript 支持尾调用优化。当函数的最后一个语句是一个函数调用时,它将被优化。例如:
fibonacci = (n, a = 1, b = 1) ->
if n <= 1 then a else fibonacci(n - 1, b, a + b)
这个函数计算斐波那契数列的第 n
项。在递归调用时,a
和 b
是下一项的前两项。这个函数的优化在 JavaScript 中是通过使用尾递归实现的:
var fibonacci;
fibonacci = function(n, a, b) {
if (a == null) {
a = 1;
}
if (b == null) {
b = 1;
}
if (n <= 1) {
return a;
} else {
return fibonacci(n - 1, b, a + b);
}
};
CoffeeScript 的函数是非常强大和灵活的。它可以轻松地定义默认参数、Rest 参数和箭头函数。而且,CoffeeScript 还支持尾调用优化,这使得递归调用不会耗尽内存。要深入了解 CoffeeScript 的函数,请查阅相关文档。