これについてまとめた
24282 ワード
これについてまとめた
Javaのようなオブジェクト向け言語の
JavaScriptは、関数呼び出しに基づいて
関数を呼び出す方法は次のとおりです.
呼び出し関数 メソッド呼び出し 呼び出しジェネレータ関数 アプリケーション/コール/バインディングコール 1.関数呼び出し
グローバルオブジェクトは、ブラウザで
オブジェクトの関数(すなわちメソッド)が呼び出されると、メソッドの
したがって、
内部関数の
次のコードを見て
2.呼び出し方法
メソッドが呼び出されると、そのメソッドを呼び出すオブジェクトにバインドされます.
JavaScriptのコンストラクション関数は、オブジェクトの作成に役立ちます.既存の関数に
一般関数に
コンストラクション関数によって生成されたオブジェクトは、 Function.prototype.call() Function.prototype.apply()
5.矢印関数のthis
矢印関数の
関数を宣言すると、矢印関数は、この関数にバインドするオブジェクトを静的に決定します.通常の関数とは異なり、矢印関数のthisは常に親scopeのthisを指します.これをLexicalisといいます.
https://poiemaweb.com/js-this
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
Javaのようなオブジェクト向け言語の
this
はクラス(インスタンス化されたオブジェクト)自身を表す.JavaScriptは、関数呼び出しに基づいて
tihs
にバインドするオブジェクトを動的に決定します.関数を宣言する場合、this
にバインドするオブジェクトは静的に決定されるのではなく、関数を呼び出すときに関数をどのように呼び出すかに基づいてthis
にバインドするオブジェクトを動的に決定します.関数を呼び出す方法は次のとおりです.
呼び出し
グローバルオブジェクトは、ブラウザで
window
を表すすべてのオブジェクトの最上位オブジェクトです.this === window; // true
グローバル範囲に宣言される関数は、グローバルオブジェクトのpropertyとしてアクセスできるグローバル変数の方法です.var gv = "Global variable";
console.log(gv);
console.log(window.gv);
function foo() {
console.log("invoked!");
}
window.foo();
デフォルトでは、this
はグローバルオブジェクトにバインドされます.グローバル関数だけでなく、内部関数の場合、this
もグローバルオブジェクトにバインドされます.function foo() {
console.log("foo's this: ", this); // window
function bar() {
console.log("bar's this: ", this); // window
}
bar();
}
foo();
内部関数の場合、this
はwindow
であってもよい.オブジェクトの関数(すなわちメソッド)が呼び出されると、メソッドの
this
は、メソッドをモデルとするオブジェクトを参照する.したがって、
function
のうちthis
はobj
を指す.var value = 1;
var obj = {
value: 100,
foo: function () {
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar() {
console.log("bar's this: ", this); // window
console.log("bar's this.value: ", this.value); // 1
}
bar();
},
};
obj.foo();
コールバック関数の場合、this
もグローバルオブジェクトにバインドされます.var value = 1;
var obj = {
value: 100,
foo: function () {
setTimeout(function () {
console.log("callback's this: ", this); // window
console.log("callback's this.value: ", this.value); // 1
}, 100);
},
};
obj.foo();
内部関数は、一般的な関数、メソッド、およびコールバック関数で宣言された場所にかかわらず、グローバルオブジェクトthis
にバインドされます.内部関数の
this
がグローバルオブジェクトを参照しないようにするにはどうすればいいですか?次のコードを見て
var value = 1;
var obj = {
value: 100,
foo: function () {
var that = this; // Workaround : this === obj
console.log("foo's this: ", this); // obj
console.log("foo's this.value: ", this.value); // 100
function bar() {
console.log("bar's this: ", this); // window
console.log("bar's this.value: ", this.value); // 1
console.log("bar's that: ", that); // obj
console.log("bar's that.value: ", that.value); // 100
}
bar();
},
};
obj.foo();
obj
を指すthis
は、that
変数に格納され、その後、内部関数においてthat
が使用される.apply
、call
を使用してもよい.2.呼び出し方法
メソッドが呼び出されると、そのメソッドを呼び出すオブジェクトにバインドされます.
function foo() {
this.check = function () {
console.log("this is", this);
};
}
var f = new foo();
f.check(); // this is foo {check: ƒ}
3.コンストラクタの呼び出しJavaScriptのコンストラクション関数は、オブジェクトの作成に役立ちます.既存の関数に
new
演算子を加えて呼び出すと、この関数はコンストラクション関数として動作します.一般関数に
new
演算子呼び出しを加えてもコンストラクション関数のように動作するため、一般コンストラクション関数は最初のアルファベットで大文字になります.コンストラクション関数によって生成されたオブジェクトは、
this
にバインドされます.function Person(name) {
this.name = name;
}
var kim = new Person("kim");
console.log(kim.name); // {name: kim}
ただし、new
のキーワードを削除すると、コンストラクション関数は使用されません.var kim = Person("kim");
console.log(kim.name); // undefined
4.apply/call/bindを呼び出すthis
にバインドされたオブジェクトは、関数呼び出しモードによってJavaScriptエンジンによってデフォルトで決定されます.この方法に加えて、this
を特定のオブジェクトに明確にバインドする方法は、apply
およびcall
である.apply
とcall
の両方がFunction.prototype
オブジェクトである方法func.call(thisArg[, arg1[, arg2[, ...]]])
// thisArg : 함수 내부의 this에 바인딩할 객체
// arg1, arg2, ... : 함수에 전달할 인자들
次のコードを見てvar person1 = {
name: "Jo",
};
var person2 = {
name: "Kim",
study: function () {
console.log(this.name + "이/가 공부를 하고 있습니다.");
},
};
person2.study(); // Kim이/가 공부를 하고 있습니다.
// call()
person2.study.call(person1); // Jo이/가 공부를 하고 있습니다.
person2.study.call(person1);
は、person2
の関数をコードで呼び出すが、call
の関数の最初のパラメータにはperson1
が加えられ、this
はperson1
を指す.func.apply(thisArg, [argsArray]);
// thisArg: 함수 내부의 this에 바인딩할 객체
// argsArray: 함수에 전달할 argument의 배열
apply
はcall
と同じであり、2番目のパラメータをアレイ形式(アレイまたは類似のアレイオブジェクト)として加えた違いを除く.5.矢印関数のthis
矢印関数の
this
は、一般的な関数のthis
とは異なります.関数を宣言すると、矢印関数は、この関数にバインドするオブジェクトを静的に決定します.通常の関数とは異なり、矢印関数のthisは常に親scopeのthisを指します.これをLexicalisといいます.
function Person() {
this.age = 0;
setTimeout(() => {
this.age++; // this는 상위 스코프인 Person 객체를 참조
console.log(this.age);
}, 1000);
}
Person(); // 1
6.参考https://poiemaweb.com/js-this
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this
Reference
この問題について(これについてまとめた), 我々は、より多くの情報をここで見つけました https://velog.io/@tlatjdgh3778/this에-대한-정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol