ES6 におけるアロー関数とその範囲の詳細な分析
ES6 の多くの優れた新機能の中で、アロー関数 (またはビッグ アロー関数) は注目に値するものの 1 つです! これは素晴らしくてクールなだけではなく、優れています。スコープを活用することで、以前使用していた技術を素早く簡単に使用でき、多くのコードを削減できます...ただし、アロー関数の原理を理解していないと理解するのが少し難しいかもしれません。矢印を見てください。機能です!
実行環境
サンプル プログラム コードをブラウザ コンソールにコピーするだけで、自分で学習して試すことができます。次に、Firefox(22) 開発者ツールの使用をお勧めします。Firefox(22) 開発者ツールは矢印機能をサポートするようになりました。Google Chrome も使用できます。Google Chrome を使用する場合は、次の 2 つのことを行う必要があります:
Google Chrome のアドレス バーに「about:flags」と入力し、[体験型 JavaScript を使用する] オプションを見つけて有効にします。
関数の先頭に use strict を追加し、Google Chrome でアロー関数をテストします (ヒント: Google Chrome v38 を使用してください。私はブラウザのバージョンで行き詰まっていました) time Pitfall):
(function(){ "use strict"; // use arrow functions here }());
幸いなことに、ES6 機能をサポートするブラウザは増えています。すべての準備が完了したので、引き続き詳しく見ていきましょう!
新しいトピック
最近、ES6 に関するトピックについて議論しています。次のようなアロー関数についてです。
=>
新しい構文
議論により、新しい構文が生まれました:
param => expression
新しい構文は変数に適用されます。複数の変数を式で宣言できます。以下はアロー関数の使用モードです:
// 一个参数对应一个表达式 param => expression;// 例如 x => x+2; // 多个参数对应一个表达式 (param [, param]) => expression; //例如 (x,y) => (x + y); // 一个参数对应多个表示式 param => {statements;} //例如 x = > { x++; return x;}; // 多个参数对应多个表达式 ([param] [, param]) => {statements} // 例如 (x,y) => { x++;y++;return x*y;}; //表达式里没有参数 () => expression; //例如var flag = (() => 2)(); flag等于2 () => {statements;} //例如 var flag = (() => {return 1;})(); flag就等于1 //传入一个表达式,返回一个对象 ([param]) => ({ key: value }); //例如 var fuc = (x) => ({key:x}) var object = fuc(1); alert(object);//{key:1}
アロー関数の実装方法
通常の関数をアロー関数に変換して実装できます。
// 当前函数 var func = function (param) { return param.split(" "); } // 利用箭头函数实现 var func = param => param.split(" ");
上記の例から、アロー関数の構文が実際に、関数本体とパラメーターを備えた新しい関数を返すことがわかります。
したがって、作成したばかりの関数を次のように呼び出すことができます。
func("Felipe Moura"); // returns ["Felipe", "Moura"]
即時実行関数 (IIFE)
これは、次のように実行できます。即時関数 アロー関数を使用します。例:
( x => x * 2 )( 3 ); // 6
このコード行は、一時関数を生成します。この関数には仮パラメータ x があり、関数の戻り値は x*2 です。その後、システムが実行されます。この一時関数はすぐに変更されます。 3 仮パラメータに値を割り当てます。 次の関数:
( (x, y) => { x = x * 2; return x + y; })( 3, "A" ); // "6A"
よくある問題をいくつかリストしました:
アロー関数によって作成された一時関数の引数は、設定しないでください:var func = x => {
return x++;
};
ログイン後にコピー
typeofvar func = x => { return x++; };
および
instanceof 関数は、一時関数を通常どおりにチェックすることもできます:
console.log(arguments); // not defined
アロー関数を括弧で囲むことは無効です:
func instanceof Function; // true typeof func; // function func.constructor == Function; // true
アロー関数は一時関数を生成しますが、この一時関数はコンストラクターではありません:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>// 有效的常规语法
(function (x, y){
x= x * 2;
return x + y;
} (3, "B") );
// 无效的箭头函数语法
( (x, y) => {
x= x * 2;
return x + y;
} ( 3, "A" ) );
// 但是可以这样写就是有效的了:
( (x,y) => {
x= x * 2;return x + y;
} )( 3,"A" );//立即执行函数</pre><div class="contentsignin">ログイン後にコピー</div></div>
プロトタイプ オブジェクトもありません:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>var instance= new func(); // TypeError: func is not a constructor</pre><div class="contentsignin">ログイン後にコピー</div></div>
This arrow この関数のスコープは他の関数とは多少異なります。strict モードではない場合、this キーワードは window を指します。strict モードでは未定義です。This inコンストラクターは現在のオブジェクト インスタンスを指します。これがオブジェクトの関数内にある場合、This はこのオブジェクトを指します。これは DOM 要素を指す場合があります。たとえば、イベント リスニング関数を追加する場合、this のポインティングは実際、この (この変数に限らず) 変数の指定はルールに基づいています。判断するには: スコープ フロー。以下に、これがイベント リスニング関数とオブジェクト関数でどのように表示されるかを示します。
イベント リスニング関数内:
func.prototype; // undefined
コンストラクター内: document.body.addEventListener('click', function(evt){
console.log(this); // the HTMLBodyElement itself
});
ログイン後にコピーIn Inこの例では、 Person.setName 関数に Person オブジェクト自体を返させると、次のように使用できます。
document.body.addEventListener('click', function(evt){ console.log(this); // the HTMLBodyElement itself });
function Person () { let fullName = null; this.getName = function () { return fullName; }; this.setName = function (name) { fullName = name; return this; }; } let jon = new Person(); jon.setName("Jon Doe"); console.log(jon.getName()); // "Jon Doe" //注:this关键字这里就不解释了,大家自己google,baidu吧。
オブジェクト内:
jon.setName("Jon Doe") .getName(); // "Jon Doe"
ただし、実行フロー ( setTimeout を使用) とスコープが変更されると、これも変更されます。
let obj = { foo: "bar", getIt: function () { return this.foo; } }; console.log( obj.getIt() ); // "bar"
setTimeout 関数が実行フローを変更すると、this のポイントはグローバル オブジェクトになるか、厳密モードでは undefine になるため、setTimeout 関数では他の変数を使用してこのオブジェクトをポイントします。 self、もちろん、どの変数を使用するかに関係なく、setTimeout にアクセスする前にまず self に値を割り当てるか、bind メソッドを使用する必要があります。そうしないと、これらの変数は未定義になります。
ここでアロー関数が登場しますが、スコープは維持でき、ポイントは変わりません。
上記の最初の例を見てみましょう。ここではアロー関数を使用します:
function Student(data){ this.name = data.name || "Jon Doe"; this.age = data.age>=0 ? data.age : -1; this.getInfo = function () { return this.name + ", " + this.age; }; this.sayHi = function () { window.setTimeout( function () { console.log( this ); }, 100 ); } } let mary = new Student({ name: "Mary Lou", age: 13 }); console.log( mary.getInfo() ); // "Mary Lou, 13" mary.sayHi(); // window
有趣和有用的使用
创建一个函数很容易,我们可以利用它可以保持作用域的特征:
例如我们可以这么使用:Array.forEach()
var arr = ['a', 'e', 'i', 'o', 'u']; arr.forEach(vowel => { console.log(vowel); });
分析:在forEach里箭头函数会创建并返回一个临时函数 tempFun,这个tempFun你可以想象成这样的:function(vowel){ console.log(vowel);}但是Array.forEach函数会怎么去处理传入的tempFunc呢?在forEach函数里会这样调用它:tempFunc.call(this,value);所有我们看到函数的正确执行效果。
//在Array.map里使用箭头函数,这里我就不分析函数执行过程了。。。。 var arr = ['a', 'e', 'i', 'o', 'u']; arr.map(vowel => { return vowel.toUpperCase(); }); // [ "A", "E", "I", "O", "U" ]
费布拉奇数列
var factorial = (n) => { if(n==0) { return 1; } return (n * factorial (n-1) ); } factorial(6); // 720
我们也可以用在Array.sort方法里:
let arr = ['a', 'e', 'i', 'o', 'u']; arr.sort( (a, b)=> a < b? 1: -1 );
也可以在事件监听函数里使用:
// EventObject, BodyElement document.body.addEventListener('click', event=>console.log(event, this));
推荐的链接
下面列出了一系列有用的链接,大家可以去看一看
总结
尽管大家可能会认为使用箭头函数会降低你代码的可读性,但是由于它对作用域的特殊处理,它能让我们能很好的处理this的指向问题。箭头函数加上let关键字的使用,将会让我们JavaScript代码上一个层次!尽量多使用箭头函数,你可以再你的浏览器测试你写的箭头函数代码,大家可以再评论区留下你对箭头函数的想法和使用方案!我希望大家能享受这篇文章,就像你会不就的将来享受箭头函数带给你的快乐.
相关免费学习推荐:js视频教程
以上がES6 におけるアロー関数とその範囲の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









typedef struct は、構造体の使用を簡素化するために構造体型のエイリアスを作成するために C 言語で使用されます。構造体の別名を指定することで、新しいデータ型を既存の構造体に別名付けします。利点としては、可読性の向上、コードの再利用、型チェックなどが挙げられます。注: エイリアスを使用する前に構造体を定義する必要があります。エイリアスはプログラム内で一意であり、宣言されているスコープ内でのみ有効である必要があります。

Java における変数の期待値の例外は、変数の初期化、null 値の使用、およびローカル変数のスコープの認識によって解決できます。

JavaScript クロージャーの利点には、変数スコープの維持、モジュール化コードの有効化、遅延実行、およびイベント処理が含まれますが、欠点としては、メモリ リーク、複雑さの増加、パフォーマンスのオーバーヘッド、およびスコープ チェーンの影響が挙げられます。

C++ の #include プリプロセッサ ディレクティブは、外部ソース ファイルの内容を現在のソース ファイルに挿入し、その内容を現在のソース ファイル内の対応する場所にコピーします。主に、コード内で必要な宣言を含むヘッダー ファイルをインクルードするために使用されます。たとえば、標準入出力関数を組み込むための #include <iostream> などです。

C++ スマート ポインターのライフ サイクル: 作成: スマート ポインターは、メモリが割り当てられるときに作成されます。所有権の譲渡: 移動操作を通じて所有権を譲渡します。リリース: スマート ポインターがスコープ外に出るか、明示的に解放されると、メモリが解放されます。オブジェクトの破壊: ポイントされたオブジェクトが破壊されると、スマート ポインターは無効なポインターになります。

できる。 C++ では、ネストされた関数の定義と呼び出しが可能です。外部関数は組み込み関数を定義でき、内部関数はスコープ内で直接呼び出すことができます。ネストされた関数により、カプセル化、再利用性、スコープ制御が強化されます。ただし、内部関数は外部関数のローカル変数に直接アクセスすることはできず、戻り値の型は外部関数の宣言と一致している必要があります。内部関数は自己再帰的ではありません。

JavaScript では、this のポインティング タイプには、1. グローバル オブジェクト、2. 関数呼び出し、4. イベント ハンドラー、5. アロー関数 (this の外側の継承) が含まれます。さらに、bind()、call()、および apply() メソッドを使用して、これが何を指すかを明示的に設定できます。

Vue では、let と var の間で変数を宣言するときのスコープに違いがあります。 スコープ: var にはグローバル スコープがあり、let にはブロック レベルのスコープがあります。ブロックレベルのスコープ: var はブロックレベルのスコープを作成しません。let はブロックレベルのスコープを作成します。再宣言: var は同じスコープ内の変数の再宣言を許可しますが、let は許可しません。
