1. まとめトップ

jQueryと無名関数 即時関数 匿名関数 使い捨て関数

無名関数(anonymous[1] function, nameless function)とは、名前付けされずに定義された関数のことである。

更新日: 2016年06月05日

8 お気に入り 27278 view
お気に入り追加

この記事は私がまとめました

twcritiqueさん

名無しの関数

無名関数(anonymous function, nameless function)とは、名前付けされずに定義された関数のことである。

(function(){})()

これはundefinedとして評価される

匿名関数

(function (){
var dog = 'Pochi';
alert(dog);
})();
今では見慣れた構文ですけど最初に見た時にかなり違和感を覚えました。
匿名の関数を作成しそのまま実行しています。

実録 無名関数 jQuery 名前空間としての考え方

(function($){
alert('nanashi');
})(jQuery);

仕組みを知っていると方程式みたいに組み立てることができます。

Queryの練習問題なんかにも良く登場しますよね。
(function ($){
var dog = $('#dog');
})(jQuery);
ノーコンフリクトなjQueryを引数で渡し匿名関数内では使い慣れた$を使用します。

jQuery(function($) {
// 実行したい処理
});

と、

(function($) {
$(function() {
// 実行したい処理
});
})(jQuery);

の効果は同じです。

(function () {
/*
* jQuery 1.2.6 - New Wave Javascript
*
* Copyright (c) 2008 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
* $Rev: 5685 $
*/
という部分がありますが、一見普通のコメントか~と思っていると1行目になんかいる!
そう、匿名関数(無名関数)ですね。
つまり、jQuery.jsの全体をこの匿名関数で覆われていて、一番最後の行(3549行目)で実行しています。
});})

実際のプラグインのコードをのぞいてみると大抵、( function(jQuery) { …… } )(jQuery)のように、プラグインコード全体が無名関数のなかに記述され、さらにプラグインが読みこまれたらすぐに実行するように、その関数にjQueryオブジェクトを引数に渡す形になっています。

(function(jQuery) {
//ここにプラグインのコードを記述
........
........
........
})(jQuery);

jQueryとprototype.jsを同時に使用すると関数$()がコンフリクトを起こすことは有名です。
意図しない上書きがおこるためです。
JavaScriptで関数・変数を外部からアクセスできないようにするためにはローカル扱いにすると可能です。

jQuery は、Prototype など $ 関数を使用する他のライブラリと同時に使用することを想定して設計されています。

無名関数の引数に jQuery を渡し、仮引数に $ を使用すれば「(function($) { ... })(jQuery);」、そのコードブロック内で jQuery の $ 関数を使用することが可能です。(そのコードブロック内では、他のライブラリの $ 関数は使用できなくなります。)

メリット

一度しか使わない関数の名前を付けなくて済む。名前の衝突を考えなくて済む。
関数の引数などに直接渡せる。

JS書く時、名前空間を汚さない様に無名関数で括るのは一般的だけど、加えて「無名関数の前に、最初に";"を入れとく」って人もいる。手元のCoffeeScriptは後者はやらないな

匿名関数を用いることで、いわゆる「使い捨て」の関数定義を、高階関数を呼び出すコードにそのまま組み込むことができるので、よりシンプルにコードを記述できる

様々な無名関数

Rubyのblock、Proc、lambdaはパワフルですが、解りにくい。Rubyはクロージャを使う方法が4つあって、それぞれチョットずつ違います。ここでは、そのへんを解説したいと思います。

書いてて思ったけど、PHPだと無名関数はcreate_functionに文字列で渡さないといけないし、

Pythonだとlambda式には単一の式しか書けないけど、Rubyの場合はそんなこと気にしないで書ける。

Pythonがlambda式に単一の式しか渡せないのは、技術的な問題というよりは、

可読性とかを重視した結果なのかな。

List("A" -> 1, "B" -> 2, "C" -> 3).map{ case (k, v) => k + v}
このパターンでは、case節が一つしか出現していませんが、実際にはいくつもcase節を並べて書くことができます。

Javaに無名関数という機能はありませんが、無名インナークラスを使えば、それっぽいことはできます。

第一級関数との関連で

JavaScriptの関数は「ファーストクラスオブジェクト(第一級オブジェクト)」である。

JavaScriptの関数はオブジェクトの一種です。つまり、定義されたプログラムを実行するだけでなく、メソッドやプロパティを持ち、またそれらを操作する事ができます。

ECMA仕様との関連で

1 2