ユーザ用ツール

サイト用ツール


ecmascript:function

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
ecmascript:function [2025/09/10 16:27] nullponecmascript:function [2025/09/14 03:26] (現在) nullpon
行 44: 行 44:
 ``` ```
  
-## 関数式+## 関数式と関数宣言
  
-中で関数を作成する方法。+これは普通の関数宣言
  
 ```javascript ```javascript
-const hoge = function() { +function hoge() { 
-  console.log('ほげ')+  console.log('ほげ');
 } }
 +```
  
-hoge();+関数式は、式の中で関数を作成する方法。 
 + 
 +```javascript 
 +const f = function hoge() 
 +  console.log('ほげ'
 +}
 ``` ```
  
行 59: 行 65:
  
 - 巻き上げが行われない - 巻き上げが行われない
-- 無名の関数を作れる+- 無名の関数を作れる(というか無名の関数を作る方が普通)
  
-くある用途Array#forEachに渡す関数+### 無名関数 
 + 
 +名前を省略すると無名関数になる。関数式を作る場合は無名関数とする方が一般的。 
 + 
 +``` 
 +const f = function() {} 
 +``` 
 + 
 + 
 +### 巻き上げ 
 + 
 +関数宣言の場合、関数の定義り前に呼び出してもエラーにならない 
 + 
 +``` 
 +f();  // これはOK 
 + 
 +function f() {} 
 +``` 
 + 
 +関数式の場合、関数の定義より前に呼び出すとエラーにな 
 + 
 +```javascript  
 +f();  // エラー 
 + 
 +const f = function() {} 
 +``` 
 + 
 +### 関数式の用途 
 + 
 +Array#forEachなど、関数を引数として受け取る関数や関数を戻り値と関数で使うことが多い
  
  
 ```javascript ```javascript
-[1,2,3].forEach(function(i) {  +const arr = [1,2,3].map(function(i) {  
-  console.log(i * 2) // => 2, 4, 6+  return i * 2;
 }); });
 +console.log(arr); // => [2,4,6]
 ``` ```
 +
 +現在このような用途では、**アロー関数式**の使用が推奨されている
 +
 +```javascript
 +const arr = [1,2,3].map((i) => i * 2);
 +
 +console.log(arr); // => [2,4,6]
 +```
 +
 +```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,2,3].forEach(function(i) => {     [1,2,3].forEach(function(i) => {
-      console.log(i * this.rate);  // 関数式のthisはグローバルオブジェクトにバインドされてしまう +      console.log(i * this.rate); 
     });       });  
   },   },
 +  
 +  g() {
 +    // 関数式ではthisを別の変数に避難させるテクニックが必要
 +    // 意図通りになるが、分かりにくく煩雑
 +    const self = this;
 +    [1,2,3].forEach(function(i) => {
 +      console.log(i * self.rate); 
 +    });    
 +  }
 +  
      
   a() {   a() {
 +    // アロー関数はthisへのバインドがなく、この環境のthisが引き継がれる
 +    // 直感的、かつシンプルに記述できる
     [1,2,3].forEach((i) => {     [1,2,3].forEach((i) => {
-      console.log(i * this.rate);  // アロー関数はthisへのバインドがなく、この環境のthisが引き継がれる+      console.log(i * this.rate);  
     });      }); 
   }   }
行 132: 行 202:
  
 obj.f();  // [NaN, NaN, NaN] obj.f();  // [NaN, NaN, NaN]
 +obj,g();  // [2, 4, 6]
 obj.a();  // [2, 4, 6] obj.a();  // [2, 4, 6]
- 
 ``` ```
  
ecmascript/function.txt · 最終更新: by nullpon