📜  CoffeeScript-函数(1)

📅  最后修改于: 2023-12-03 14:59:58.481000             🧑  作者: Mango

CoffeeScript 函数

简介

CoffeeScript 是一种编译成 JavaScript 的编程语言,它在语法上的一些改动让代码更加简洁易读。在 CoffeeScript 中,函数是一个很重要的概念。

定义函数

在 CoffeeScript 中,定义函数使用 -> 符号。例如:

multiply = (x, y) -> x * y

这个函数接受两个参数 xy,并返回它们的乘积。在 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 参数

当我们需要将一个变量中的所有参数传递给另一个函数时,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 项。在递归调用时,ab 是下一项的前两项。这个函数的优化在 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 的函数,请查阅相关文档。