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

回答編集履歴

1

追記

2016/12/23 07:10

投稿

退会済みユーザー
answer CHANGED
@@ -78,4 +78,88 @@
78
78
  xxxx(function(){
79
79
  :
80
80
  });
81
- ```
81
+ ```
82
+ ---
83
+ 追記
84
+
85
+ 無名関数 1回きりしか使わない関数なの?
86
+ ---
87
+ > 引用テキスト無名関数の呼び出しは関数名でできないので、関数自体を変数に入れて変数名で呼び出すか、 即時関数にして呼び出さないといけない。
88
+
89
+ ご自身で記載している上記通りで、変数に入れておけばその変数で何度でも呼び出せます。
90
+
91
+ var answer = sum(1,2);のansertの中身は何?
92
+ ---
93
+ sum(1,2)の形をみてください。
94
+ これは私が記載した関数を実行する形です。
95
+ よって、answerには関数sumの実行結果(return)が入ります。
96
+
97
+ 即時関数は無名関数の一種ではないの?
98
+ ---
99
+ 即時関数と無名関数に何ら関わりはありません。
100
+ もう一度記載しますが、
101
+ 即時関数とは、関数宣言と同時に関数を実行するテクニックであり
102
+ 無名関数とは、関数名を定義しない事です。
103
+
104
+ ただ、即時関数は関数の宣言と同時に即実行するので関数名を定義しない事がおおいので
105
+ その事をいっているものと思いますが、即時関数と無名関数に関わりはありません。
106
+
107
+ 即時関数とは関数を()で囲んで)の後に引数を指定すれば即時関数?
108
+ ---
109
+ ```Javascript
110
+ (function(){})(引数)
111
+ ```
112
+ 基本そうです。
113
+
114
+ 少し難しい話なので、最初の回答ではあえて記載しませんでしたが、
115
+ javascriptにはfunction文(以下**文**)とfunction式(以下**式**)があります。
116
+ function 関数名(){} このような関数宣言は**文**となります。
117
+
118
+ **文**の特徴は関数の巻上げが行われます。
119
+ 関数の巻上げとは、どこで宣言してもその宣言を先頭で宣言したものとして扱います
120
+ ですので、このように関数宣言より前にその関数を実行しても問題なく実行できます
121
+
122
+ ```Javascript
123
+ hoge();
124
+
125
+ function hoge(){
126
+ }
127
+ ```
128
+
129
+ では、関数文を即時関数にするために関数宣言の後に()で呼び出して見るとどうなるか
130
+
131
+ ```Javascript
132
+ var a;
133
+
134
+ a = 1;
135
+
136
+ function hoge(){
137
+ } (); // ここで即時関数にしようとして、関数宣言の後に()を付けて呼び出す
138
+ ```
139
+
140
+ これだけではJavascriptはhoge関数を文として認識するため
141
+ 関数の巻上げが起こり、以下と同等の扱いになり、()が意味不明なものになります
142
+
143
+ ```Javascript
144
+ function hoge(){ // 関数の巻上げで先頭で宣言されたものとされる
145
+ }
146
+
147
+ var a;
148
+
149
+ a = 1;
150
+
151
+ (); // ()だけ残り意味不明な状態となる
152
+ ```
153
+
154
+ その為、関数の巻き上げが行われない**式**として認識させる必要があります。
155
+
156
+ その方法の一つが関数宣言を()で囲むことです。
157
+ (function() {})
158
+ これでこの関数を式として認識するので、実行させるため最後に()をつけて実行します。
159
+ (function() {})();
160
+
161
+ 式として認識させる方法は()で囲む他色々ありますが。
162
+ 人が見て一番分りやすい形が()で囲む方法なので、この形が使われています。
163
+
164
+ 余談ですが、uglifyなんかすると()だと2文字使用するので!が使われる事が多いです
165
+ !function(){}()