下記のコードを Node.js 0.10.26 / Chrome 39 / FireFox 33.1 のいずれで実行しても、console.log の引数の func は関数オブジェクトになります。
lang
1(function func(){ 2 console.log(func); // [Function: func] 3 func = 123; 4 console.log(func); // [Function: func] 5}());
てっきり↓こうなると思っていました。
lang
1(function func(){ 2 console.log(func); // [Function: func] 3 func = 123; 4 console.log(func); // 123 5}());
関数内部で var func
を付けると、func は普通の変数になります。
lang
1(function func(){ 2 var func; 3 console.log(func); // undefined 4 func = 123; 5 console.log(func); // 123 6}());
もちろん、関数式の外側のスコープに関数式の名前の識別子は存在しません。
lang
1console.log(typeof func); // undefined 2(function func(){ 3 var func; 4 console.log(func); // undefined 5 func = 123; 6 console.log(func); // 123 7}()); 8console.log(typeof func); // undefined
関数宣言の場合は再代入すれば普通に値が変わるため、関数宣言の関数名の識別子は普通の変数のように思います。
lang
1console.log(func); // [Function: func] 2function func(){ 3 console.log(func); // [Function: func] 4 func = 123; 5 console.log(func); // 123 6} 7func(); 8console.log(func); // 123
再代入できないものとして this とか null とかを思いつきましたが、これらに再代入しようとするとエラーになります。
lang
1null = 123; // ReferenceError: Invalid left-hand side in assignment
名前付き関数式の内部での関数名の識別子は、これらの再代入できない this や null とも違う動きをしますし、通常の変数の識別子とも違う動きをするように思います。
名前付き関数式の内部での関数名の識別子は、通常の変数とは異なる何かなのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/11/24 04:03