[JavaScript]名前つき関数オブジェクトのスコープ
- 2007-06-18
- カテゴリ: Client Side
- タグ: JavaScript Tips
たまたま調べたので忘れないようにメモ。
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
1 件のトラックバック
- [JavaScript]IEで名前つき関数オブジェクトの扱いが変
-
以前、JavaScriptの名前つき関数オブジェクトのスコープについて調べたことがあった。
僕は名前つき関数オブジェクトを使うのが好きだからよく使う。↓のような感じに。
var fn = function s...
- 2007-11-29
- 発信元: 文系大学的IT系の悲哀

