his
17922 ワード
リファレンス , コンテキストの実行 , arrow function
複数の言語において、
JavaScriptの
より詳細には、JavaScriptでは、
実行contextとは、
バインディングとは、呼び出しに基づいて特定のオブジェクトにリンクすることです.
この4つのバインド操作を見てみましょう
一般関数の実行方法に従って、
ここで、
したがって、
別の例
暗黙的バインドとは、関数がオブジェクトを介して呼び出されると、このオブジェクトがthisのcontextオブジェクトになることを意味します.
したがって、出力を
ここでは、デフォルトのバインドに関連付けることができます.
グローバルスキャンで生成された変数がグローバルオブジェクトに登録されているため、
逆に、
関数オブジェクトには、
1.新しいオブジェクトを作成します.
2.新しく生成されたオブジェクトのプロトタイプチェーンは、呼び出し関数のプロトタイプチェーンに関連付けられます.
3.生成されたオブジェクトをこのコンテキストとして明示的に使用して関数を実行します.
4.生成されたオブジェクトを返します.
この言葉はどういう意味ですか.
一言で言えば、再創造の対象を指す.
矢印関数では、
矢印関数で宣言されたscopeの一部を使用するthis contextです.
矢印関数は
これらの特徴は、コールバック関数を記述する際に役立ちます.コールバックも関数であるため、es 5ではthisがグローバルオブジェクトを指し、es 6は親環境のthisを継承します.
this
複数の言語において、
this
は自分の属する対象を表す.JavaScriptの
this
は他の言語のようにnewキーワードで自分を表すことができますが、使用する方法はもっと多いです.より詳細には、JavaScriptでは、
this
が実行コンテキストになります.(オブジェクト関連)実行contextとは、
호출자가 누구냐는 것
と理解できる.(注目するオブジェクトの程度を知る)this
は、関数の呼び出し方法に従って動的に決定されるので、このバインディングによって、どの値に関連するかを決定することができる.バインディングとは、呼び出しに基づいて特定のオブジェクトにリンクすることです.
この4つのバインド操作を見てみましょう
1.デフォルトバインド(グローバルオブジェクト)
一般関数の実行方法に従って、
this
はグローバルオブジェクト(window)をcontextオブジェクトとする.var name = 'red';
function foo () {
console.log(this.name);
}
foo(); // red
グローバル範囲で定義された変数は、グローバルオブジェクトに登録されます.ここで、
foo()
のように関数を呼び出す方式を一般関数実行方式と呼ぶ.したがって、
var name = red
はwindow.name = red
に等しく、このオブジェクトに変数を登録することは、グローバルスキャンで変数を宣言することに等しい.別の例
var age = 100;
function foo () {
var age = 99;
bar(age)
}
function bar () {
console.log(this.age);
}
foo();
上記のコードでは、bar
関数はfoo
関数内部で通常の関数実行方式で実行されるため、bar
関数にどのようなパラメータが伝達されてもbar
関数内部のthis.age
はwindow.age
を指すため、グローバル変数100
が出力される.2.暗黙的バインド(実行方法)
暗黙的バインドとは、関数がオブジェクトを介して呼び出されると、このオブジェクトがthisのcontextオブジェクトになることを意味します.
var b = 100;
function test() {
console.log(this.a);
}
var obj = {
a: 20,
func1: test,
func2: function() {
console.log(this.a);
}
};
obj.func1(); // 20
obj.func2(); // 20
上記の例では、func1
およびfunc2
がobj
によって呼び出されるので、obj
はthis
となる.したがって、出力を
console.log(this.b)
に変更すると、undefined
が出力される.ここでは、デフォルトのバインドに関連付けることができます.
var b = 100;
function test() {
console.log(this.b);
}
var obj = {
a: 20,
func1: test,
func2: function() {
console.log(this.b);
}
};
var obj2 = {
b: 40
};
obj.func1(); // 20
obj.func2(); // 20
活動場所を表すvar gFunc1 = obj.func1;
gFunc1(); // 100
obj2.func = obj1.func;
obj2.func(); // 40
上記コードが付加されると、gFunc1
は100
を出力する.グローバルスキャンで生成された変数がグローバルオブジェクトに登録されているため、
gFunc1
のthis contextがグローバルオブジェクトとなり、グローバル変数のbを出力することができる.逆に、
obj2.func
はobj2
contextで生成されるので、obj2
のb変数値が出力される.3.明示的なバインド
関数オブジェクトには、
call
、apply
、bind
のメソッドがあり、このときに最初のパラメータに渡されるのがthis contextオブジェクトです.function test() {
console.log(this);
}
var obj = { name: "yuddomack" };
test.call(obj); // { name: 'yuddomack' }
上記のコードでは、test
のthis
はwindowではなく、obj
です.(この関数のthisはthisと明確に表すことができます!!)4.バインドジェネレータ
new
キーワードを介してクラス設計モードでバインドされます.function foo(a) {
this.a = a;
this.qwer = 20;
}
var bar = new foo(2);
console.log(bar.a); // 2
console.log(bar.qwer); // 20
動作順から見ると1.新しいオブジェクトを作成します.
2.新しく生成されたオブジェクトのプロトタイプチェーンは、呼び出し関数のプロトタイプチェーンに関連付けられます.
3.生成されたオブジェクトをこのコンテキストとして明示的に使用して関数を実行します.
4.生成されたオブジェクトを返します.
この言葉はどういう意味ですか.
// 1. 새 객체가 만들어짐
var obj = {};
// 2. 새로 생성된 객체의 Prototype 체인이 함수의 프로토타입과 연결됨
Object.setPrototypeOf(obj, foo.prototype); // 프로토타입을 연결합니다. 이 글에서는 무시해도 상관없습니다.
// 3. 1에서 생성된 객체를 context 객체로 사용(명시적으로)하여 함수가 실행됨
foo.call(obj, 2);
// 4. 이 함수가 객체를 반환하지 않는 한 1에서 생성된 객체가 반환됨
var bar2 = obj; // 여기서 foo는 반환(return)이 없으므로 인스턴스가 생성(된 것처럼 동작)
console.log(bar2.a); // 2
console.log(bar2.qwer); // 20
new
でオブジェクトを生成するふりをして、実際には上記のコードのようなプロセスが発生します.(以上のプロセスは新しい形で一度に完了!)一言で言えば、再創造の対象を指す.
5. Arrow Function(es6)
矢印関数では、
this
が特に動作します.矢印関数で宣言されたscopeの一部を使用するthis contextです.
function objFunction() {
console.log(this.foo); // 13
return {
foo: 25,
bar: () => console.log(this.foo) // 13 vs 25
};
}
objFunction.call({foo: 13}).bar();
bar
が矢印関数でない場合、25
(暗黙的バインド)を出力する必要があります.これは、メソッドを持つオブジェクトを指すためです.矢印関数は
Lexical this
を有するため、出力される13
は、親環境thisを継承する明示的なバインドと同じである.これらの特徴は、コールバック関数を記述する際に役立ちます.コールバックも関数であるため、es 5ではthisがグローバルオブジェクトを指し、es 6は親環境のthisを継承します.
Reference
この問題について(his), 我々は、より多くの情報をここで見つけました https://velog.io/@soosungp33/JavaScript-this-bind-call-applyテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol