Posted at

JavaScriptの関数について


はじめに

Java出身である自分自身、JavaScript関数のJava関数とは異なる挙動を整理しきれていないと感じていてため、一覧にまとめた。


JavaScript 関数概要

まずはじめにJavaScriptにおける関数(以下、関数と呼ぶ)は第1級オブジェクトである。第1級オブジェクトとは生成、代入、演算、受け渡しができる対象のこと(=値である)と定義されている。つまり関数はオブジェクトであり、値である。以下、JavaScriptにおける関数について他の言語にはない特徴や性質を中心に列挙していく。


関数宣言と関数式


定義

関数宣言は以下のように定義する

function add(num1, num2){

return num1 + num2;
}

関数式は以下のように定義する

var add = function(num1, num2){

return num1 + num2;
}


関数の巻き上げ

変数や関数の宣言が、自身のスコープ内のコードの一番上に来ているかのような動作を巻き上げという。関数を使用するコードを書いた後にその関数を宣言することができる。関数宣言では関数の巻き上げが行われる。

var result = add(5,5);

function add(num1, num2){
return num1 + num2;
}

関数式では関数巻き上げは行われない。つまり以下はエラーが発生する。

var result=add(5,5);

var add=function(num1, num2){
return num1 + num2;
}

先の関数の巻き上げについての説明にて関数を使用するコードを書いた後にその関数を宣言することができると、あたかも便利であるというニュアンスで述べているが、基本的には関数の巻き上げが実行されるようなコードは書くべきではないとされる。他のたいていの言語なら当てはまるコードを上から読んでいくという行動ルールから外れることを余儀なくされるからである。他人がコードを見る可能性が有る限り、関数は必ず変数に代入し、使用する前に定義した方が良いとされる。


関数の受け渡し

関数概要で述べたとおり、関数はオブジェクトであり、値である。つまり関数を値のように受け渡すことができる。

function hoge(){

console.log("hoge!");
}

hoge();
// hoge!と表示

var hoge2 = hoge;

hoge2();
// hoge!と表示


関数の引数

関数には任意の数の引数を渡すことができる。

function reflect(value){

return value;
}
console.log(reflect("Hi"));
console.log(reflect("Hi",25));


オーバーロード

同じ関数名の複数の関数を、その関数が持つ引数の型、数、並び順によって実行する関数を呼び分けるのがオーバーロードである。しかし「関数の引数」の項目で述べたとおり、JavaScriptの関数は任意の引数の数を取ることができる、また型は指定されていない。以上よりJavaScriptはオーバーロードをサポートしていない。JavaScriptでは同じ名前で複数の関数を定義すると、最後に定義した関数が有効になり、先に定義した関数は消える。

function sayMessage(message){

if(arguments.length===0){
message="デフォルトメッセージです";
}
console.log(message);
}
sayMessage("Hello");

sayMessage();


最後に

コンストラクタの挙動は今後追記したい。


参考文献

オブジェクト指向JavaScriptの原則