up:: JavaScript and TypeScript

無名関数と即時関数

まずは普通の関数(関数宣言)

通常、関数を使う場合はこう書く。

function hoge(x,y){
	return x*y;
}

また、関数は変数に代入することができる。

let myfun = function hoge(x,y){
	return x*y;
}

代入した変数に引数を渡すと、中の関数に渡したものとして処理される。

let result = myfun(3,2);
//6

ちなみに、関数宣言はホイストがかかる。

無名関数

ここで、「だったら関数名要らないじゃん」となったのが無名関数
変数への代入時に無名で入力できる。
もちろん引数や戻り値としても使える。

let myfun = function (x,y){
	return x*y;
}
 
let result = myfun(3,2);
//6

また、このように関数定義と同時に変数に代入する式を関数式(関数リテラル) と呼ぶ。
関数リテラルは**ホイストされない。**

なお、マジで無名なわけではなく、.nameをコンソールに出力すると名前がついているのが見える。

即時関数

さらに「引数も先に定義すればよくね?」となったのが即時関数(IIFE:Invoked Immediatery Function Expression)。
{}の後に();で引数を定義する。セミコロンを忘れずに。

let myfun = function (x,y){
	return x*y;
}(3,2);
 
let result = myfun;
//6

利点

  • 関数の名前を考えなくていい
  • 高階関数(関数自体を引数や戻り値として扱うことができる関数)のコードがシンプルになる。
  • ホイスト(Hoisting)、およびグローバルスコープ名の汚染の回避

一番下が大きい。

【JavaScript入門】すぐわかる!無名関数とは | 侍エンジニアブログ

JavaScriptで即時関数を使う方法【初心者向け】 | TechAcademyマガジン

【JavaScript】関数定義いろいろ - Qiita