NodeJSとブラウザにおけるthisのキーワードの違い


前言
JavaScriptを勉強したことがある人はきっと違った環境の下でthisの指摘問題がはっきりしています。では、下のコードを見てください。

var type = 1
function toWhere(){
	this.type = 2;
}
toWhere();
console.log(type)
きっとそう思います。
ここでは、グローバル変数typeを宣言します。type=1を実行すると、1の値が割り当てられます。その後toWhere関数が呼び出され、関数の中にthisがあることを見て、thisの方向を判断します。ここでは、thisがwindowを指しています。this.type=2が実行されると、グローバル変数typeは2になります。
最後にグローバル変数typeの結果を印刷します。明らかに2です。

ブラウザを開けて確認してみてください。大丈夫です。2つはあそこにあります。
これで終わりですか?
nodeを学んだことがあれば、nodejsで上記のコードをもう一度実行してみてください。違いを発見しました。

あなたは今それを発見しました。1はどうしてこんなに違っていますか?2に等しいのではないですか?
関連デバッグ
以上の例から、同じjsコードがブラウザで実行されるか、nodejsで実行されるかによって結果が異なります。
これは実はthisが問題を指すためですが、これは私達が一般的に認識しているものとは違っています。これはnodeの仕事原理による問題です。

var type = 1
function toWhere() {
 this.type = 2
 console.log("   this  ",this)
}
toWhere()
console.log(type)
console.log("   this",this)
1、ブラウザのthisを印刷します。

関数の中でthisはwindowを指して、全体のthisもwindowを指しました。
2、nodeJsの中のthisを印刷します。

見つけたでしょう。関数のthisはObject[global]を指します。
関数のthisに値を付けると、globalのオブジェクトに引っかかります。したがって、全体の中のthisの値は変えられません。
ノードの原理解析
では、なぜこうなりましたか?
まず、私たちはnodeJsの仕事の原理を理解しなければなりません。
ブラウザが直接グローバル範囲で実行するスクリプトファイル
Nodeでは、Nodeはコードを即座に呼び出された匿名関数に隠し、グローバルレンジにglobalを使ってアクセスすることができます。
前の説明では、外部で印刷されたthisは空のオブジェクトを指しています。nodeで実行されているどのファイルも実は一つの{}に包まれています。だから、スクリプトファイルは全部自分のクローズドで実行されます。以下のように。

{
	(function(){
		//    
	})()
}
前の例では、関数の外部thisは空のオブジェクトを指していますが、関数内部のthisは指定された実行コンテキストがないので、globalオブジェクトを指しています。
締め括りをつける
ここで、NodeJSとブラウザの中のthisキーワードの違いについての記事を紹介します。NodeJSブラウザの中のthisキーワードの内容については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。