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

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

序文

JavaScript を学習した人なら誰でも、さまざまな環境で this がどこを指すかという問題を認識しているはずです。次のコードを見てください

varタイプ = 1
関数toWhere(){
	タイプ = 2;
}
どこにあるのか();
console.log(タイプ)

あなたはきっとこう思うでしょう:

ここでグローバル変数の型が宣言されます。type=1 が実行されると、値に 1 が割り当てられます。その後、toWhere 関数が呼び出されます。関数内で this を見ると、this がどこを指しているかがわかります。ここでは、this が wi​​ndow を指していることは明らかです。this.type=2 が実行されると、グローバル変数 type に値 2 が割り当てられます。

最後に、グローバル変数の型が出力され、結果は明らかに 2 になります。

ブラウザを開いて確認すると、そこには明らかに 2 が表示されます。

これで終わりですか?

Node を学習し、上記のコードを nodejs で再実行すると、違いがわかります。

1 が間違っていることに気が付きました。2 と同じではないでしょうか?

関連するデバッグ

上記の例から、同じ js コードをブラウザと nodejs で実行すると結果が異なることがわかります。

これは実はこの指摘の問題によるものですが、この指摘は私たちが通常知っているものとは異なります。このポインティング問題はノードの動作原理によって引き起こされます

varタイプ = 1
関数toWhere() {
 このタイプ = 2
 console.log("関数内の this が指している", this)
}
どこへ()
console.log(タイプ)
console.log("グローバルにこれ", this)

1.ブラウザでこれを印刷する

関数内のthisはwindowを指し、グローバルなthisもwindowを指しています。

2. これをNode.jsで印刷する

見つかりました。関数内のこれは、Object [global] を指します。

関数の this に値を割り当てると、その値は実際にはグローバル オブジェクトにアタッチされます。だから、世界的にこの価値は変わらないだろう

ノード原理分析

では、なぜこのようなことが起こるのか見てみましょう。

まず、Node.jsがどのように動作するかを理解する必要があります

ブラウザによってグローバルスコープで直接実行されるスクリプトファイル

Node では、すぐに呼び出される匿名関数内にコードが隠されます。global を使用してグローバル スコープにアクセスできます。

前回の説明で、外部に出力された this は空のオブジェクト {} を指していることがわかりました。実際、ノードで実行されるファイルは {} でラップされているため、スクリプトファイルは次のように独自のクロージャで実行されます。

{
	(関数(){
		//スクリプトファイル })()
}

前の例では、関数の外側では this は空のオブジェクト {} を参照し、関数の内側では this には指定された実行コンテキストがないため、グローバル オブジェクト - (匿名関数の実行コンテキストのグローバル スコープにアクセスできる) を参照します。

要約する

NodeJS とブラウザの this キーワードの違いについての記事はこれで終わりです。NodeJS とブラウザの this キーワードについての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Node.js を使用してコマンドライン ゲームを実装する方法
  • Nodejs は、複数の人が同時にオンラインでマウスを動かして小さなゲームを共有することを実現します。
  • Node.js を使用したマルチプレイヤー ゲーム サーバー エンジンの実装
  • Node.js リアルタイム マルチプレイヤー ゲーム フレームワーク
  • node.js はゲームのバックエンド開発に適していますか?
  • Nodejs でタイムドクローラーを実装する完全な例
  • Node.js の TCP 接続処理のコア プロセス
  • ゲームの Node.JS バージョンを作成する方法

<<:  MySQL データベースは SQL ステートメントを知っている必要があります (拡張バージョン)

>>:  Tencent Cloud で HTTPS を無料で導入する方法

推薦する

MySQL の集計関数 count の使用法とパフォーマンスの最適化テクニック

この記事の環境はWindows 10、MySQLのバージョンは5.7.12-logです1. 基本的な...

CSS3はグラフィックの落下アニメーション効果を実現します

まずは効果を確認実装コード <div class="box box1"&g...

vue-cli4.5.xはプロジェクトを素早く構築します

1. vue-cliをインストールする vue.js で vue.js を実行します。 2. プロジ...

Nginx リバース プロキシを使用してクロスドメイン問題を解決する方法の詳細な説明

質問前回のクロスドメイン リソース共有に関する記事では、ドメイン間で Cookie を送信する場合、...

CSS でベジェ曲線の実装を反転する方法

まずは、以前書いた CSS カルーセルアニメーション効果を見てみましょう。アニメーションの遷移をスム...

Nodeイベントループの包括的な理解

目次ノードイベントループイベントループ図メインスレッドイベントループタイマーキューの仕組み投票キュー...

Ubuntu環境でPHPとNginxをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で PHP と Nginx をコンパイルしてインストールする方法につ...

JavaScriptの基本構文とデータ型の詳細な説明

目次JavaScript のインポート1. 内部ラベル2. 外部紹介基本的な構文データ型番号弦ブール...

HTML タグのセマンティクス化 (H5 を含む)

導入HTML は、Web ドキュメントのコンテンツのコンテキスト構造と意味を提供します。HTML 自...

HTM と HTML の違いは何ですか? HTM と HTML の違いは何ですか?

Web デザインを学習する過程で、html と htm の関係など、遭遇した多くの問題について深く...

シェルでパスワードなしでMySQLデータベースに素早くログインする方法

背景Shell の mysql-client を介して MySQL データベースにログインする場合、...

IDEA の Docker プラグインを介して Springboot プロジェクトを公開する方法の詳細なチュートリアル

1. Dockerfileを書く(1)プロジェクト名を右クリックして新しいテキストファイルを作成し、...

JS ES6における構造化分解についてお話しましょう

概要es6 では、配列またはオブジェクトから指定された要素を取得する新しい方法が追加されました。これ...

レスポンシブレイアウトの概要(推奨)

レスポンシブレイアウト開発の基礎知識この章は主に以下の部分に分かれています• レスポンシブデザインを...

Linux sshのデフォルトのリモートポート番号を変更する6つの手順

Linux のデフォルトの ssh リモート ポートは 22 です。デフォルトのポートは、悪意のある...