Get Started - 3. Digging to the Roots of JS
このシリーズではYou Don't Know JS Yet(第1版「YouDon't Know JS」の改訂版)をまとめた.内容についての質疑応答もネクタイにありますので、参考にしていただければ助かります.内容に間違いや気になるところがあればメッセージを!
Iteration
作成プログラムの最大の原因はデータの処理ですが、データが非常に大きい場合は、完全な処理が困難です.最終的には、データセットを1つずつ処理する必要があります.データセットを処理する方法は反復です.反復に挿入されるデータセットをiterableと呼びます.
doSomething( ...it );
var vals = [ ...it ];
for..of
を使用して、他の言語と同様にiterableを1つずつ処理できます.特に、JSの特殊な文法はSpreadで、iterable(その名の通り)を使用することができます.たとえば、関数に複数のパラメータ(上記のコードなど)を入れる場合、Spreadを使用してiterableをコピーしたり、Spreadを使用してiterableをコピーしたりすることができます.var buttonNames = new Map();
buttonNames.set(btn1,"Button 1");
buttonNames.set(btn2,"Button 2");
for (let [btn,btnName] of buttonNames) {
btn.addEventListener("click", function(){
console.log(`Clicked ${ btnName }`);
});
}
Iterableには、配列、文字列、マッピングが含まれます.特に、マッピングが反復器で処理されると、keyとvalueを同時に有する新しいエントリとしてデータが処理される.上記のコードでは、buttonNames
はDOM要素btn
をキーとし、命名文字列の値のマッピングはfor..of
であり、四角カッコ内にbtn
とbtnName
を入れ、エントリ内の値に2つの値を割り当てる.これは「array destructuring」と呼ばれ、主に反復器でよく使われる方法の一つです.Closure
本の中でこのようにClosureを定義しました
Closure is when a function remembers and continues to access variables from outside its scope, even when the function is executed in a different scope.
要約すると、スキャン範囲を超えてもいくつかの値が保持されている場合、これらの値を外部から使用できる方法をエンクロージャと呼びます.
function counter(step = 1) {
var count = 0;
return function increaseCount(){
count = count + step;
return count;
};
}
var incBy1 = counter();
var incBy3 = counter(3);
incBy1(); // 1
incBy1(); // 2
incBy3(); // 3
incBy3(); // 6
また、モジュールを作成するたびに新しいスキャンが行われます.上記のコードでは同じcounter()
関数が使用されており、そのうちのstep
が使用として保存されていることも見られる.別の例は、forループによってaddEventListener
に値が配置され、bntName
の値がそれぞれ異なり、コードが動作するかどうかを決定することができるmap反復器である.私たちはYDNJSY第2巻Scope&Cloosureを通じてScopeのより具体的な内容を学びます.
this Keyword
JSの最新キーワードは
this
です.this
が呼び出されるたびに、それらの用途が変化し、コンテンツも変化するのが新しい方法です.ここで、this
のコアは、コードがthis
をどのように呼び出すかに依存する.これは実行コンテキストと関係があるが,深く議論するのではなく,this
の原理を簡単に紹介する.function classroom(teacher) {
return function study() {
console.log(
`${ teacher } says to study ${ this.topic }`
);
};
}
var assignment = classroom("Kyle");
assignment();
// Kyle says to study undefined
var homework = {
topic: "JS",
assignment: assignment
};
homework.assignment();
// Kyle says to study JS
var otherHomework = {
topic: "Math"
};
assignment.call(otherHomework);
// Kyle says to study Math
以上のコードはthis
を最も理解できるコードのようです.コアはthisの位置ではなく、コードが実行される位置であることに注意してください.classroom()
を呼び出して作成されたassignment
変数は、study()
関数を受信し、this
を含む.このthis
は、コード内で同じ位置にありますが、値は実行位置に依存します.デフォルトでは、this
にグローバル変数(ブラウザはwindow
、nodejsはglobal
)があるため、関連付けられていない場合はこのグローバル変数があります.assignment
が最初に実行されたときには何の関連もないため、window
またはglobal
にはtopic
がないため、undefined
が生成される.ただし、実行時に次の2つの例に関連付けられている場合、
this
が変更され、homework
ではhomework.assignment()
が実行されている場合の前のhomework
が関連付けられているため、this
がhomework
に割り当てられる.だからJSを出力します.別の関連付け方法は、call()
を使用することである.関数パラメータにthis
に関連付けるオブジェクトを配置すると、otherHomework
は、以下に示すようにthis
に割り当てられます.Prototypes
this
が関数のプロパティである場合、オブジェクトの最も代表的なプロパティはPrototypeです.Prototypeは、オブジェクト間の関係を接続するプロパティです.デフォルトでは、すべてのオブジェクトがobject.prototype
をPrototypeとして使用します.新しいプロトタイプを接続したい場合は、Object.create()
で関係を確立できます.var homework = {
topic: "JS"
};
var otherHomework = Object.create(homework);
otherHomework.topic; // "JS"
otherHomework.topic = "Math";
otherHomework.topic; // "Math"
homework.topic; // "JS"
上記のコードおよび写真では、
otherHomework
はhomework
によって作成され、写真と同じPrototype関係を有する.otherHomework
の値を変更した場合、homework
の値は変更されません.これは直接参照関係ではなく「Prototype」です.Reference
この問題について(Get Started - 3. Digging to the Roots of JS), 我々は、より多くの情報をここで見つけました https://velog.io/@cos/YDNJSY-Get-Started-3-Digging-to-the-Roots-of-JSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol