スタートページJavascriptCoffeeScript
CoffeeScriptの概要(1)変数の指定(2)制御命令← CoffeeScript文法の基本(3)関数→ (4)クラス

CoffeeScript文法の基本(3)関数

    関数記述の一般構造
    引数のオプション指定
    関数の階層化

関数記述の一般構造

  CoffeeScript


# 引数なし、戻り値なし
関数A = ->
    alert "関数A結果"
    return
関数A()

# 引数あり、戻り値なし
関数B = (x) ->
    y = 2+x
    alert "#{y}"
    return
関数B(5)


# 引数なし、戻り値あり
関数C = ->
    y = 10
alert 関数C();



# 引数あり、戻り値あり
関数D = (x) ->
    if x >= 0
        y = x + x
    else
        y = x * x
alert 関数D 5
alert 関数D -5
  
  JavaScript

var 関数A, 関数B, 関数C, 関数D;
// 引数なし、戻り値なし
関数A = function() {
  alert("関数A結果");
};
関数A();   // 関数A結果

// 引数あり、戻り値なし
関数B = function(x) {
  var y;
  y = 2 + x;
  alert(`${y}`);
};
関数B(5);   // 7

// 引数なし、戻り値あり
関数C = function() {
  var y;
  return y = 10;
};
alert(関数C());   // 10

// 引数あり、戻り値あり
関数D = function(x) {
  var y;
  if (x >= 0) {
    return y = x + x;
  } else {
    return y = x * x;
  }
};
alert(関数D(5));   // 10
alert(関数D(-5));  // 25

引数のオプション指定

位置引数のデフォルト指定
関数(x, y, [z]) のように、z はオプションで省略時には z=0 とするような場合です。
「関数 = (x, y, z=0) 」として記述し、呼出しで「関数 1,2.3」とすれば z=3 になるし、「関数 1, 2」では z=0 になります。
下例は、x+y+z を求めています。
可変長引数
引数を「x...」とすると、イメージ的には x[0], x[1], … を与えることになります。
下例は、Σx[i] を求めています。
  CoffeeScript


関数A = (x, y, z=0) ->
    合計 = x + y + z


alert 関数A(1, 2, 3)
alert 関数A(1, 2)

関数B = (x...) ->
    合計 = 0
    for xi in x
        合計 += xi
    return 合計

alert 関数B(1, 2, 3)
  
  JavaScript

var 関数A, 関数B;
関数A = function(x, y, z = 0) {
  var 合計;
  return 合計 = x + y + z;
};
alert(関数A(1, 2, 3));   // 6
alert(関数A(1, 2));      // 3

関数B = function(...x) {
  var i, len, xi, 合計;
  合計 = 0;
  for (i = 0, len = x.length; i < len; i++) {
    xi = x[i];
    合計 += xi;
  }
  return 合計;
};

alert(関数B(1, 2, 3));   // 6

関数の階層化

主関数 関数 の引数で タイプ="A" を指定すれば内部関数 関数A (x+y)、"B" とすれば 関数B(x*y) を行うような処理です。

  CoffeeScript

関数 = (タイプ, x, y) ->
    関数A = ->
        return x + y
    関数B = ->
        return x * y

    if タイプ is "A" then 結果 = 関数A()
    if タイプ is "B" then 結果 = 関数B()
    return 結果

alert 関数("A", 2, 3)
alert 関数("B", 2, 3)


  
  JavaScript

var 関数;

関数 = function(タイプ, x, y) {
  var 結果, 関数A, 関数B;
  関数A = function() {
    return x + y;
  };
  関数B = function() {
    return x * y;
  };
  if (タイプ === "A") {
    結果 = 関数A();
  }
  if (タイプ === "B") {
    結果 = 関数B();
  }
  return 結果;
};

alert(関数("A", 2, 3));   // 5
alert(関数("B", 2, 3));   // 6