Javascript_ this(1)


Javascript_ this


JavaScriptでは、他の言語とは異なり、どこでも使用できます.関数とオブジェクト(メソッド)の区切りは緩やかですが、この区切りで区切ります.
デフォルトでは、関数を呼び出すときに決定されます.

グローバルスペースのthis

console.log(this)  //window {...}           
グローバルスペースで呼び出すと、ウィンドウオブジェクトが表示されます.
JavaScriptグローバルスペースで変数を宣言すると、その変数はウィンドウオブジェクト(nodejs環境ではグローバル)に割り当てられます.

メソッド内部のthis


関数を実行するために、関数として呼び出される場合もあれば、メソッドとして呼び出される場合もあります.二人の唯一の違いは独立性があることだ.名前の通り、関数自体は独立した機能を実行し、メソッドは呼び出したターゲットオブジェクトに関連する操作を実行します.
を選択します.
let func = function(x) {
 console.log(this, x);
}
func(1);  // window {...} 
 
let obj = {
 method : func
 };

obj.method(2); // {method : f}
obj['method'](2); // {method :f}   
メソッドthisを呼び出すと、対応するメソッドが表示されます.
呼び出しオブジェクトなのでobj["method"]のようにできます.

関数として呼び出されたときの関数内部のthis


関数として関数を呼び出す場合は、thisは指定されません.これには、呼び出しボディに関する情報が含まれている必要があります.ただし,関数呼び出しは直接実行され,オブジェクトが指定されていないため不明である.
let obj = {
 outer : function() {
 	console.log(this); // 1
 	let innerFunc = function(){
 		console.log(this); // 2, 3
 	}
 	innerfunc()
 	let obj2 = {
 		innerMethod : innerFunc
 	};
 	obj.innerMethod();
 }
};
obj1.outer()
1番コンソールlogはobj 1です.outer関数を呼び出すときはouterの前にあります.メソッドで呼び出されるのでobj 1が呼び出されます.
2番コンソールlogはinnerfunc()によって呼び出されます.ないので、関数として呼び出すのでwindowを呼び出します.
3番コンソールログはobjです.innerMethod()によって呼び出されます.obj 2の呼び出しがメソッド呼び出しの原因

グローバルオブジェクトをバインドしないで、周囲の環境のオブジェクトを継承して使用します。


ES 5以前の構文
let obj = {
 outer : function() {
 	console.log(this); // 1
 	let innerFunc = function(){
 		console.log(this); // 2
 	}
 	innerfunc()
 	let self = this; // 추가!
 	let innerFunc2 = function() {
 		console.log(self); // 3
 	}
};
obj1.outer()
//1はobj、//2はwindow//3はobj

Arrow functionは、ES 6におけるこのグローバルオブジェクトビューの問題を解決するために使用される


本当に解決したいのか分からないけど解決した
let obj = {
 outer: function(){
 	console.log(this);
 	let innerFunc = () => {
 		console.log(this);
 	};
 	innerFunc();
 }
};
obj.outer()
矢印関数として使用する場合はconsole.両方のlogに{outer:f}が表示されます.