[JavaScript]名前つき関数オブジェクトのスコープ

[JavaScript]名前つき関数オブジェクトのスコープ

たまたま調べたので忘れないようにメモ。

JavaScriptでは、↓のように匿名関数に名前をつけられるというのは有名な話。

var six = (function factorial(n) { return (n > 0) ? n * factorial(n - 1) : 1; })(3);

匿名関数の中で再帰処理をまわすときに便利。

このとき、関数オブジェクトにつけた名前はどこのスコープに属するのかが気になったから調べてみた。ECMAScriptの仕様書を読めばたぶん書いてあるんだが、探すよりコード書いてしまうほうが速いので。

/* 関数の外 */
var funcObj = function funcName() {};
window.alert(typeof funcName);    /* undefined */
/* 関数の中 */
var funcObj = function funcName() {
    window.alert(typeof funcName);
};
funcObj();    /* function */

予想できた結末ながら、関数オブジェクトの名前はその関数の中でのみ有効なようです。関数名の衝突を恐れる必要はなさそうです。

名前つき関数オブジェクトの生成は、関数宣言とよく似ていますが、違うものなので注意しましょう。

/* 名前つき関数オブジェクト生成 */
var obj = function funcName() {};
window.alert(typeof funcName);    /* undefined */
/* 関数宣言 */
function func() {}
window.alert(typeof func);    /* function */

ちなみに、名前つき関数オブジェクトを使わなくても、arguments.calleeを使ってやれば、匿名関数の再帰は可能です。

var six = (function(n) { return (n > 0) ? n * arguments.callee(n - 1) : 1; })(3);
/* 関数オブジェクト名とarguments.calleeは同じもの */
(function test() {
    window.alert(arguments.callee === test);    /* true */
})();

メモメモ。

スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/17-60c0cf72

トラックバック

[JavaScript]IEで名前つき関数オブジェクトの扱いが変
以前、JavaScriptの名前つき関数オブジェクトのスコープについて調べたことがあった。 僕は名前つき関数オブジェクトを使うのが好きだからよく使う。↓のような感じに。 var fn = function s...
  • 2007-11-29
  • 発信元: 文系大学的IT系の悲哀

コメント

コメントの投稿

お名前
コメント
編集キー