ecmascript:function
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン | |||
ecmascript:function [2025/09/10 16:27] – nullpon | ecmascript:function [2025/09/14 03:26] (現在) – nullpon | ||
---|---|---|---|
行 44: | 行 44: | ||
``` | ``` | ||
- | ## 関数式 | + | ## 関数式と関数宣言 |
- | 式の中で関数を作成する方法。 | + | これは普通の関数宣言 |
```javascript | ```javascript | ||
- | const hoge = function() { | + | function |
- | console.log(' | + | console.log(' |
} | } | ||
+ | ``` | ||
- | hoge(); | + | 関数式は、式の中で関数を作成する方法。 |
+ | |||
+ | ```javascript | ||
+ | const f = function | ||
+ | console.log(' | ||
+ | } | ||
``` | ``` | ||
行 59: | 行 65: | ||
- 巻き上げが行われない | - 巻き上げが行われない | ||
- | - 無名の関数を作れる | + | - 無名の関数を作れる(というか無名の関数を作る方が普通) |
- | よくある用途はArray# | + | ### 無名関数 |
+ | |||
+ | 名前を省略すると無名関数になる。関数式を作る場合は無名関数とする方が一般的。 | ||
+ | |||
+ | ``` | ||
+ | const f = function() {} | ||
+ | ``` | ||
+ | |||
+ | |||
+ | ### 巻き上げ | ||
+ | |||
+ | 関数宣言の場合、関数の定義より前に呼び出してもエラーにならない | ||
+ | |||
+ | ``` | ||
+ | f(); // これはOK | ||
+ | |||
+ | function f() {} | ||
+ | ``` | ||
+ | |||
+ | 関数式の場合、関数の定義より前に呼び出すとエラーになる | ||
+ | |||
+ | ```javascript | ||
+ | f(); // エラー | ||
+ | |||
+ | const f = function() {} | ||
+ | ``` | ||
+ | |||
+ | ### 関数式の用途 | ||
+ | |||
+ | Array# | ||
```javascript | ```javascript | ||
- | [1,2,3].forEach(function(i) { | + | const arr = [1,2,3].map(function(i) { |
- | | + | |
}); | }); | ||
+ | console.log(arr); | ||
``` | ``` | ||
+ | |||
+ | 現在このような用途では、**アロー関数式**の使用が推奨されている | ||
+ | |||
+ | ```javascript | ||
+ | const arr = [1, | ||
+ | |||
+ | console.log(arr); | ||
+ | ``` | ||
+ | |||
+ | ```javascript | ||
+ | function x(i) { | ||
+ | return (j) => i * j; | ||
+ | } | ||
+ | |||
+ | x(2)(3) // => 6 | ||
+ | ``` | ||
+ | |||
+ | |||
## メソッド | ## メソッド | ||
行 98: | 行 152: | ||
``` | ``` | ||
- | ## アロー関数 | + | ## アロー関数式 |
- | 関数式の簡潔な代替構文。しかし多少の機能の違いもある | + | 関数式の簡潔な代替構文。 |
- | + | ||
- | - メソッドにできない(this、arguments、superへのバインドがない) | + | |
- | - コンストラクタにできない | + | |
- | - ジェネレータにできない | + | |
```javascript | ```javascript | ||
行 112: | 行 162: | ||
``` | ``` | ||
- | メソッドの中で関数式を書く場合は、アロー関数を使うと意図通りに動作するだろう | + | しかし多少の機能の違いもある。 |
+ | |||
+ | - メソッドにできない(this、arguments、superへのバインドがない) | ||
+ | - コンストラクタにできない | ||
+ | - ジェネレータにできない | ||
+ | |||
+ | この性質の違いによって、大抵のケースではアロー関数式を使う方が良い結果となる。例えばメソッドの中で関数式を書くと意図通りに動作しないが、アロー関数ならば意図通りに動作する。 | ||
```javascript | ```javascript | ||
行 119: | 行 176: | ||
| | ||
f() { | f() { | ||
+ | // 関数式のthisはobjではなく、グローバルオブジェクトにバインドされてしまう | ||
[1, | [1, | ||
- | console.log(i * this.rate); | + | console.log(i * this.rate); |
}); | }); | ||
}, | }, | ||
+ | | ||
+ | g() { | ||
+ | // 関数式ではthisを別の変数に避難させるテクニックが必要 | ||
+ | // 意図通りになるが、分かりにくく煩雑 | ||
+ | const self = this; | ||
+ | [1, | ||
+ | console.log(i * self.rate); | ||
+ | }); | ||
+ | } | ||
+ | | ||
| | ||
a() { | a() { | ||
+ | // アロー関数はthisへのバインドがなく、この環境のthisが引き継がれる | ||
+ | // 直感的、かつシンプルに記述できる | ||
[1, | [1, | ||
- | console.log(i * this.rate); // アロー関数はthisへのバインドがなく、この環境のthisが引き継がれる | + | console.log(i * this.rate); |
}); | }); | ||
} | } | ||
行 132: | 行 202: | ||
obj.f(); | obj.f(); | ||
+ | obj, | ||
obj.a(); | obj.a(); | ||
- | |||
``` | ``` | ||
ecmascript/function.txt · 最終更新: by nullpon