Javascript|this|矢印
var obj = {
name: "B",
print: function () {
var inner1 = function () {
console.log(this.name, name);
};
inner1();
var inner2 = () => {
console.log(this.name, name);
};
inner2();
var name = "C";
console.log(window.name, this.name, name);
},
};
name = "A";
obj.print();
私の新製品print()のnameの値はよくわかりません.間違いそうですね?
=>前回ハウスティンに関する文章。.
これは何を意味しますか?名前が変わるかどうかわからない
=>今回のリリースに整理します.
this
これは、関数呼び出しによって変化する自己参照オブジェクトです.
通常はグローバルオブジェクト(ブラウザではwindow、ノード環境ではglobal)です.
メソッドまたはコンストラクション関数では、thisは自分を表します.
ちょっと難しいですが、コードで調べてみましょう. var obj = {
name: "B",
print: function () {
console.log("obj.print 안의 this");
console.log(this);
var inner1 = function () {
console.log("obj.print 안의 inner1 안의 this");
console.log(this);
console.log(this.name, name);
};
inner1();
var inner2 = () => {
console.log("obj.print 안의 inner2 안의 this");
console.log(this);
console.log(this.name, name);
};
inner2();
var name = "C";
console.log(window.name, this.name, name);
},
};
name = "A";
console.log("기본 this");
console.log(this);
obj.print();
上のコードは各セクションにログを残して、thisの変化を理解します.
デフォルトでは、Windowsはグローバルオブジェクトであるため、Windowsを表します.
obj.print()が宣言されると、print()ではobjのメソッド呼び出しの結果となるため、自分のobjがそれになります.
print()のinner 1では、グローバルオブジェクトウィンドウを再度表します.
print()では、このメソッドのみが影響を受けます.Inner 1に影響しません.
print()のinner 2では、なぜグローバルオブジェクトではないのでしょうか.
inner 2は矢印関数なので.
矢印関数
矢印関数の背景
[10, 20, 30].map(function (element) {
return element * 2;
})
// [20, 40, 60]
矢印関数の前に、関数キーとして関数を使用します.function() {
// logic
}
しかし、functionキーワードは簡単に関数をマークすることができず、矢印関数が現れ、より簡単に使用することができます.
矢印関数の特徴
var obj = {
name: "B",
print: function () {
console.log("obj.print 안의 this");
console.log(this);
var inner1 = function () {
console.log("obj.print 안의 inner1 안의 this");
console.log(this);
console.log(this.name, name);
};
inner1();
var inner2 = () => {
console.log("obj.print 안의 inner2 안의 this");
console.log(this);
console.log(this.name, name);
};
inner2();
var name = "C";
console.log(window.name, this.name, name);
},
};
name = "A";
console.log("기본 this");
console.log(this);
obj.print();
矢印関数の背景
[10, 20, 30].map(function (element) {
return element * 2;
})
// [20, 40, 60]
矢印関数の前に、関数キーとして関数を使用します.function() {
// logic
}
しかし、functionキーワードは簡単に関数をマークすることができず、矢印関数が現れ、より簡単に使用することができます.矢印関数の特徴
function () {
// logic
}
() => {
// logic
}
以上の2つのコードは同じコードです.矢印を使用すると、関数キーを必要とせずに操作を簡略化できます.匿名関数としてのみ使用できるため、関数宣言式ではなく関数式を使用します.
特にコールバック関数を使用する場合、より簡潔です.
[10, 20, 30].map((element) => { return element * 2 })
// [20, 40, 60]
// parameter 괄호 생략, return 생략
[10, 20, 30].map(element => element * 2)
// [20, 40, 60]
['1', '2', '3'].map(Number)
// [1, 2, 3] 모두 string이 아닌 number
パラメータが1の場合、カッコは省略できます.戻りのみで、特定の論理がない場合は、戻りを省略できます.
2.これは違います.
矢印関数のthisは、常に静的宣言矢印関数のthisと同じです.
print()のinner 2は矢印関数であるため、inner 2のthisはprint()のthisと同じである.
n/a.結論
これが何を意味するか分かります.
this.nameが何を意味するか分かりました.
print()はobjオブジェクトのメソッドであるためobjを表す.
print()のinner 1は、グローバルオブジェクトを表す関数です.
だから心の中のこれは名前はwindownameは「A」を表し、nameはprint()にプラス記号で宣言され、初期化されず、定義されていない.
print()のinner 2は矢印関数であるため、print()のthis objと同じです.
だから中のこれは名前はobjです.nameは「B」を表し、nameもundefinedである.
print()の中のこれ.名前はobjです.nameは「B」、nameは「C」を表す.
整理する
これは通常、グローバルオブジェクトを表しますが、呼び出し方法によって異なります.
矢印関数thisは、静的に宣言されたthisと同じです.
リファレンス
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
https://poiemaweb.com/js-this
https://poiemaweb.com/es6-arrow-function
Reference
この問題について(Javascript|this|矢印), 我々は、より多くの情報をここで見つけました
https://velog.io/@dishate/Javascript-this-화살표
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(Javascript|this|矢印), 我々は、より多くの情報をここで見つけました https://velog.io/@dishate/Javascript-this-화살표テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol