ホームページ ウェブフロントエンド フロントエンドQ&A es6のアロー関数と通常の関数の違いは何ですか

es6のアロー関数と通常の関数の違いは何ですか

Mar 08, 2022 pm 12:11 PM
javascript es6 アロー関数 通常の関数

違い: 1. アロー関数の定義は、通常の関数の定義よりもはるかに単純、明確、高速です; 2. アロー関数は独自の this を作成しませんが、通常の関数は作成します; 3.アロー関数はコンストラクタとして使用できません アロー関数はコンストラクタとして使用できます; 4. アロー関数には独自の引数がありませんが、アロー関数には引数があります。

es6のアロー関数と通常の関数の違いは何ですか

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

アロー関数はフロントエンドインタビューにおける高頻度のテストポイントです。アロー関数はES6のAPIです。ご存知の方も多いと思います。通常の関数に比べて構文が単純なので、みんなに深く愛されてます。

1. 基本構文

ES6 では、矢印 => を使用してアロー関数を定義できます。具体的な構文は、簡単な例を見てみましょう:

// 箭头函数
let fun = (name) => {
    // 函数体
    return `Hello ${name} !`;
};

// 等同于
let fun = function (name) {
    // 函数体
    return `Hello ${name} !`;
};
ログイン後にコピー

アロー関数の定義は、数学的構文では通常の関数よりもはるかに簡単であることがわかります。アロー関数は、function キーワードを省略し、アロー => を使用して関数を定義します。関数のパラメーターは => の前のかっこ内に配置され、関数本体は => の後の中括弧内に配置されます。

アロー関数のパラメータについて:

アロー関数にパラメータがない場合は、空の括弧を記述します。

アロー関数にパラメータが 1 つしかない場合は、パラメータを囲む括弧を省略することもできます。

アロー関数に複数のパラメータがある場合は、パラメータをカンマ (,) で区切って括弧で囲みます。

// 没有参数
let fun1 = () => {
    console.log(111);
};

// 只有一个参数,可以省去参数括号
let fun2 = name => {
    console.log(`Hello ${name} !`)
};

// 有多个参数
let fun3 = (val1, val2, val3) => {
    return [val1, val2, val3];
};
ログイン後にコピー

アロー関数の関数本体について:

アロー関数の関数本体のコードが 1 行だけの場合、単に変数を返すか、単純な JS 式を返す場合は、関数本体の中括弧 { } を省略できます。

let f = val => val;
// 等同于
let f = function (val) { return val };

let sum = (num1, num2) => num1 + num2;
// 等同于
let sum = function(num1, num2) {
  return num1 + num2;
};
ログイン後にコピー

アロー関数の関数本体に、オブジェクトを返すコードが 1 行しかない場合は、次のように記述できます。

// 用小括号包裹要返回的对象,不报错
let getTempItem = id => ({ id: id, name: "Temp" });

// 但绝不能这样写,会报错。
// 因为对象的大括号会被解释为函数体的大括号
let getTempItem = id => { id: id, name: "Temp" };
ログイン後にコピー

If アロー関数の関数本体にはステートメントが 1 つだけあり、値を返す必要はありません (最も一般的なのは関数を呼び出すことです)。このステートメントの前の #

let fn = () => void doesNotReturn();
ログイン後にコピー
最も一般的なアロー関数の目的は、コールバック関数を簡素化することです。
// 例子一
// 正常函数写法
[1,2,3].map(function (x) {
  return x * x;
});

// 箭头函数写法
[1,2,3].map(x => x * x);

// 例子二
// 正常函数写法
var result = [2, 5, 1, 4, 3].sort(function (a, b) {
  return a - b;
});

// 箭头函数写法
var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);
ログイン後にコピー

#2. アロー関数と通常の関数の違い

##1. 構文がより簡潔で明確になります

上記の基本的な構文の例からわかるように、アロー関数の定義は、通常の関数の定義よりもはるかに単純、明確、高速です。

2. アロー関数は独自の this を作成しません (重要!! 詳しく理解してください!!)

まずは MDN のアロー関数を見てみましょう

これについての説明

アロー関数は独自の this を作成しないため、独自の

this
を持たず、その上位レベルからのみ開始されます。独自のスコープ チェーン

this を継承します。 アロー関数には独自の this がありません。

#definition
の際にその位置をキャプチャします (定義されるとき、呼び出されるときではありません) 外部実行環境の

##this を取得し、この this 値を継承します。したがって、アロー関数内の this のポイントは、定義時にすでに決定されており、後で変更されることはありません。 例を見てみましょう: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>var id = &amp;#39;Global&amp;#39;; function fun1() { // setTimeout中使用普通函数 setTimeout(function(){ console.log(this.id); }, 2000); } function fun2() { // setTimeout中使用箭头函数 setTimeout(() =&gt; { console.log(this.id); }, 2000) } fun1.call({id: &amp;#39;Obj&amp;#39;}); // &amp;#39;Global&amp;#39; fun2.call({id: &amp;#39;Obj&amp;#39;}); // &amp;#39;Obj&amp;#39;</pre><div class="contentsignin">ログイン後にコピー</div></div>上の例では、関数 fun1

setTimeout

で通常の関数が使用されています。関数は 2 秒後に実行されます。この時点で関数は実際にはグローバル スコープで実行されるため、

this

Window オブジェクトと this.id## を指します。 # グローバル変数 id を指すため、出力は 'Global' になります。 ただし、関数 fun2setTimeout はアロー関数を使用しています。このアロー関数の this は定義時に決定され、その外層を継承します#fun2 の実行環境に ##this があり、fun2 が呼び出されると、thiscall によってオブジェクト ## に変更されます。 メソッド #{id: 'Obj'} であるため、'Obj' が出力されます。 別の例を見てみましょう:

var id = &#39;GLOBAL&#39;;
var obj = {
  id: &#39;OBJ&#39;,
  a: function(){
    console.log(this.id);
  },
  b: () => {
    console.log(this.id);
  }
};

obj.a();    // &#39;OBJ&#39;
obj.b();    // &#39;GLOBAL&#39;
ログイン後にコピー
上の例では、オブジェクト obj のメソッド a は、通常の関数 ## を使用して定義されています。 #通常の関数 オブジェクトのメソッドとして呼び出された場合、this

は、それが属するオブジェクト

を指します。したがって、

this.id

obj.id であるため、'OBJ' が出力されます。 ただし、メソッド b はアロー関数を使用して定義されており、アロー関数の this は実際には、それが定義されているグローバル実行環境の this を継承するため、 Window オブジェクトなので、'GLOBAL' が出力されます。 (ここで、オブジェクトを定義する中括弧 {} は別個の実行環境を形成できないことに注意してください。オブジェクトは依然としてグローバル実行環境内にあります!!)<p><strong>3、箭头函数继承而来的this指向永远不变(重要!!深入理解!!)</strong></p><p>上面的例子,就完全可以说明箭头函数继承而来的<code>this指向永远不变。对象obj的方法b是使用箭头函数定义的,这个函数中的this永远指向它定义时所处的全局执行环境中的this,即便这个函数是作为对象obj的方法调用,this依旧指向Window对象。

4、.call()/.apply()/.bind()无法改变箭头函数中this的指向

.call()/.apply()/.bind()方法可以用来动态修改函数执行时this的指向,但由于箭头函数的this定义时就已经确定且永远不会改变。所以使用这些方法永远也改变不了箭头函数this的指向,虽然这么做代码不会报错。

var id = &#39;Global&#39;;
// 箭头函数定义在全局作用域
let fun1 = () => {
    console.log(this.id)
};

fun1();     // &#39;Global&#39;
// this的指向不会改变,永远指向Window对象
fun1.call({id: &#39;Obj&#39;});     // &#39;Global&#39;
fun1.apply({id: &#39;Obj&#39;});    // &#39;Global&#39;
fun1.bind({id: &#39;Obj&#39;})();   // &#39;Global&#39;
ログイン後にコピー

5、箭头函数不能作为构造函数使用

我们先了解一下构造函数的new都做了些什么?简单来说,分为四步: ① JS内部首先会先生成一个对象; ② 再把函数中的this指向该对象; ③ 然后执行构造函数中的语句; ④ 最终返回该对象实例。

但是!!因为箭头函数没有自己的this,它的this其实是继承了外层执行环境中的this,且this指向永远不会随在哪里调用、被谁调用而改变,所以箭头函数不能作为构造函数使用,或者说构造函数不能定义成箭头函数,否则用new调用时会报错!

let Fun = (name, age) => {
    this.name = name;
    this.age = age;
};

// 报错
let p = new Fun(&#39;cao&#39;, 24);
ログイン後にコピー

6、箭头函数没有自己的arguments

箭头函数没有自己的arguments对象。在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值。

// 例子一
let fun = (val) => {
    console.log(val);   // 111
    // 下面一行会报错
    // Uncaught ReferenceError: arguments is not defined
    // 因为外层全局环境没有arguments对象
    console.log(arguments); 
};
fun(111);

// 例子二
function outer(val1, val2) {
    let argOut = arguments;
    console.log(argOut);    // ①
    let fun = () => {
        let argIn = arguments;
        console.log(argIn);     // ②
        console.log(argOut === argIn);  // ③
    };
    fun();
}
outer(111, 222);
ログイン後にコピー

上面例子二,①②③处的输出结果如下:

es6のアロー関数と通常の関数の違いは何ですか

很明显,普通函数outer内部的箭头函数fun中的arguments对象,其实是沿作用域链向上访问的外层outer函数的arguments对象。

可以在箭头函数中使用rest参数代替arguments对象,来访问箭头函数的参数列表!!

7、箭头函数没有原型prototype

let sayHi = () => {
    console.log(&#39;Hello World !&#39;)
};
console.log(sayHi.prototype); // undefined
ログイン後にコピー

8、箭头函数不能用作Generator函数,不能使用yeild关键字

【相关推荐:javascript视频教程web前端

以上がes6のアロー関数と通常の関数の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 JavaScript と WebSocket: 効率的なリアルタイム画像処理システムの構築 Dec 17, 2023 am 08:41 AM

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。

See all articles