teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

名前付き関数式と関数宣言の事例追加

2016/02/22 15:49

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ # IE8- は名前付き関数式を関数宣言としても扱う
2
+
1
3
  名前付き関数式の関数名は関数内部だけで参照できるのが ECMAScript 5 の仕様ですが、IE8 には名前付き関数式を関数宣言と同じように扱ってしまうバグがありました。
2
4
  その為、IE8 を動作対象に含める場合には気を使う方法でした。
3
5
  (汚染されても気をつければ問題ないこともあるのですが、場合によっては関数スコープに閉じ込める必要がありました。)
@@ -26,4 +28,30 @@
26
28
  - [Function.name - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name)
27
29
  - [Function.prototype.toString() - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString)
28
30
 
31
+ # 名前付き関数式と関数宣言(関数定義)
32
+
33
+ 名前付き関数式の関数名は読み取り専用で後から変更できません。
34
+ その為、関数自身を再帰呼び出しする場合において安全に自身を呼び出せる利点があります。
35
+ 関数宣言では変数名による参照に限定される為、後から名前(変数名)を変更できてしまいます。
36
+
37
+ ```JavaScript
38
+ 'use strict';
39
+ /**
40
+ * 関数宣言(関数定義)
41
+ */
42
+ function hoge1 () { console.log(hoge1); }
43
+ var hoge2 = hoge1;
44
+ hoge1 = null;
45
+ hoge2(); // null
46
+
47
+ /**
48
+ * 名前付き関数式
49
+ */
50
+ var foo1 = function foo1 () { console.log(foo1); },
51
+ foo2 = foo1;
52
+
53
+ foo1 = null;
54
+ foo2(); // function foo1() { console.log(foo1); }
55
+ ```
56
+
29
57
  Re: hirokiman さん