ホームページ  >  記事  >  ウェブフロントエンド  >  es6のアロー機能を使う際の注意点は何ですか?

es6のアロー機能を使う際の注意点は何ですか?

青灯夜游
青灯夜游オリジナル
2022-03-23 13:04:022144ブラウズ

注: 1. アロー関数は、上位スコープ内の this のポイントと一致するように、関数内の this のポイントを変更します; 2. これをコンストラクターとして使用することはできません。コマンドは使用できません; 3. いいえ 引数オブジェクトは使用できます; 4. yield コマンドは使用できず、ジェネレーター関数として使用できません。

es6のアロー機能を使う際の注意点は何ですか?

このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。

es6 の新しい構文では、アロー関数が登場します。

ES6 では、「矢印」(=>) を使用して関数を定義できます。

		function fun(a){ return a; }
// ↓ 去掉 function 在 ( ) 和 { } 之间添加 => 
		var fun = (a) => { return a; }  
// ↓ 如果只有一个形参可省略 ( ) 如果一个形参都没有,必须加( )         
		var fun = a => { return a; }  
// ↓ 如果函数体只有一句话,可省略{ },如果仅有的这句话还是 return, 则必须省略 return         
		var fun = a => a

ES6 のアロー関数に関する注意事項

(1) アロー関数は、関数内の this のポイントを、関数内の this のポイントと一致するように変更します。上位スコープ

関数本体内の this オブジェクトは、それが使用されるオブジェクトではなく、定義されるオブジェクトです。

(2) はコンストラクターとして使用できません。つまり、新しいコマンドは使用できません。そうでない場合は、エラーがスローされます。

(3) 引数オブジェクトは関数本体に存在しないため使用できません。これを使用したい場合は、代わりにrestパラメータを使用できます。

(4) yield コマンドが使用できないため、アロー関数をジェネレーター関数として使用できません。

上記 4 点のうち、特に注目すべき点は 1 つ目です。このオブジェクトのポインタは可変ですが、アロー関数では固定です。

function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

var id = 21;

foo.call({ id: 42 });
// id: 42

上記のコードでは、setTimeout のパラメータはアロー関数です。このアロー関数の定義は、foo 関数が生成されたときに有効になり、実際の実行は 100 ミリ秒後まで待機しません。 。通常の関数であれば、実行時にグローバルオブジェクトウィンドウを指すはずで、このとき21が出力されるはずです。ただし、アロー関数により、this は関数定義が有効になるオブジェクト (この場合は {id: 42}) を常に指すため、出力は 42 になります。
アロー関数は、setTimeout の this が、バインディングが実行されるスコープを指すのではなく、バインディングが定義されているスコープを指すようにすることができます。別の例を示します。

function Timer() {
  this.s1 = 0;
  this.s2 = 0;
  // 箭头函数
  setInterval(() => this.s1++, 1000);
  // 普通函数
  setInterval(function () {
    this.s2++;
  }, 1000);
}

var timer = new Timer();

setTimeout(() => console.log('s1: ', timer.s1), 3100);
setTimeout(() => console.log('s2: ', timer.s2), 3100);
// s1: 3
// s2: 0

上記のコードでは、Timer 関数内に 2 つのタイマーがそれぞれアロー関数と通常の関数を使用して設定されています。前者の this バインディングはスコープ (つまり、Timer 関数) で定義され、後者の this バインディングは、それが実行されるスコープ (つまり、グローバル オブジェクト) を指します。したがって、3100 ミリ秒後、timer.s1 は 3 回更新されましたが、timer.s2 は 1 回も更新されていません。

アロー関数を使用すると、この点を修正できます。この機能は、コールバック関数をカプセル化する場合に非常に役立ちます。以下は、DOM イベントのコールバック関数がオブジェクトにカプセル化される例です。

var handler = {
  id: '123456',

  init: function() {
    document.addEventListener('click',
      event => this.doSomething(event.type), false);
  },

  doSomething: function(type) {
    console.log('Handling ' + type  + ' for ' + this.id);
  }
};

上記のコードの init メソッドでは、アロー関数が使用されています。これにより、アロー関数内の this が常にハンドラー オブジェクトを指すようになります。そうしないと、コールバック関数の実行時に this.doSomething 行でエラーが報告されます。これは、現時点ではこれがドキュメント オブジェクトを指しているためです。

このポインティングの固定は、アロー関数内に this をバインドするメカニズムがあるためではありません。実際の理由は、アロー関数には独自の this がまったくなく、内部の this がこれは外側のコードブロックです。これがないため、コンストラクターとして使用できません。

つまり、アロー関数を ES5 に変換するコードは次のとおりです。

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

// ES5
function foo() {
  var _this = this;

  setTimeout(function () {
    console.log('id:', _this.id);
  }, 100);
}

上記のコードでは、変換された ES5 バージョンは、アロー関数が独自の this をまったく持たず、外側の this を参照していることを明確に示しています。

【関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

以上がes6のアロー機能を使う際の注意点は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。