JSに関する7つの面接の質問、あなたはいくつ正しく答えられますか

JSに関する7つの面接の質問、あなたはいくつ正しく答えられますか

序文

JavaScript では、これは関数呼び出しコンテキストです。この動作が非常に複雑であるからこそ、JavaScript の面接では必ずこれに関する質問がされます。

面接に備える最良の方法は練習することです。そこでこの記事では、このキーワードに関する興味深いインタビューを 7 つまとめました。

注: 次の JavaScript コードは非厳密モードで実行されます。

1: 変数とプロパティ

次のコードの出力は何でしょうか?

定数オブジェクト = {
 メッセージ: 'Hello, World!',

 取得メッセージ() {
 const message = 'こんにちは、地球!';
 this.message を返します。
 }
};

console.log(object.getMessage()); // => ?

答え:

出力: 'Hello, World!'

object.getMessage() はメソッド呼び出しなので、メソッド内の this は object と等しくなります。

メソッドには変数宣言 const message = 'Hello, Earth!' もありますが、これは this.message の値には影響しません。

2: 猫の名前

次のコードの出力は何でしょうか?

関数 Pet(名前) {
 this.name = 名前;

 this.getName = () => this.name;
}

const cat = new Pet('Fluffy');

console.log(cat.getName()); // => ?

const { getName } = cat;
console.log(getName()); // =>?

答え:

出力: 「ふわふわ」と「ふわふわ」

関数がコンストラクターとして呼び出されると ( new Pet('Fluffy') )、コンストラクター内の this は構築されたオブジェクトと等しくなります。

Pet コンストラクターの this.name = name 式は、構築されたオブジェクトに name プロパティを作成します。

this.getName = () => this.name this.getName = () => this.name 構築されたオブジェクトに getName メソッドを作成します。矢印関数が使用されているため、矢印関数内の this は、コンストラクター Pet である外部スコープ内の this と等しくなります。

cat.getName() と getName() を呼び出すと、式 this.name が返され、これは 'Fluffy' と評価されます。

3: 遅延出力

次のコードの出力は何でしょうか?

定数オブジェクト = {
 メッセージ: 'Hello, World!',

 ログメッセージ() {
 console.log(this.message); // => ?
 }
};

タイムアウトを設定します(object.logMessage、1000);

答え:

1秒の遅延後、出力: undefined

setTimeout() 関数は object.logMessage をコールバックとして使用しますが、メソッドではなく通常の関数として object.logMessage を呼び出します。通常の関数呼び出しでは、これはグローバル オブジェクト (ブラウザー環境では window) と等しくなります。そのため、logMessage メソッド内の console.log(this.message) は、未定義の window.message を出力します。

課題: このコードを変更して「Hello, World!」を出力するにはどうすればよいでしょうか?解決策を以下のコメント欄に書いてください*

4: コードを完成させる

出力が「Hello, World!」となるようにコードを完成させます。

定数オブジェクト = {
 メッセージ: 'Hello, World!'
};

関数logMessage() {
 console.log(this.message); // => "Hello, World!"
}

// ここにコードを記述します...

答え:

オブジェクトのメソッドとして logMessage() を呼び出す方法は少なくとも 3 つあります。いずれも正解とみなされます:

定数オブジェクト = {
 メッセージ: 'Hello, World!'
};

関数logMessage() {
 console.log(this.message); // => 'Hello, World!'
}

// func.call() メソッドを使用する logMessage.call(object);

// func.apply() メソッドを使用する logMessage.apply(object);

// 関数バインディングを使用します const boundLogMessage = logMessage.bind(object);
バウンドログメッセージ();

5. 挨拶と別れ

次のコードの出力は何でしょうか?

定数オブジェクト = {
 誰: '世界'、

 挨拶する() {
 `Hello, ${this.who}!` を返します。
 },

 さようなら: () => {
 `さようなら、${this.who}!` を返します。
 }
};

console.log(object.greet()); // => ?
console.log(object.farewell()); // => ?

答え:

出力: 'Hello, World!' および 'Goodbye, undefined!'

object.greet() が呼び出されると、greet は通常の関数であるため、greet() メソッド内の this の値は object と等しくなります。したがって、object.greet() は 'Hello, World! ' を返します。 '。

しかし、 farewell() はアロー関数なので、アロー関数内の this の値は常に外側のスコープの this と等しくなります。 farewell() の外側のスコープはグローバル スコープであり、this はグローバル オブジェクトです。したがって、object.farewell() は実際には「Goodbye, ${window.who}!」を返し、これは「Goodbye, undefined!」と評価されます。

6: トリッキーな長さ

次のコードの出力は何でしょうか?

var 長さ = 4;
関数コールバック() {
 console.log(this.length); // => ?
}

定数オブジェクト = {
 長さ: 5,
 メソッド(コールバック) {
 折り返し電話();
 }
};

オブジェクト.メソッド(コールバック、1、2);

答え:

出力: 4

method() 内で通常の関数呼び出しを使用して callback() を呼び出します。通常の関数呼び出し中の this の値はグローバル オブジェクトと等しいため、callback() 関数内では this.length は window.length になります。

最も外側のレベルの最初のステートメント var length = 4 は、グローバル オブジェクトにプロパティ length を作成するため、window.length は 4 になります。

最後に、callback() 関数内では、this.length の値は window.length となり、4 が出力されます。

7: 呼び出しパラメータ

次のコードの出力は何でしょうか?

var 長さ = 4;
関数コールバック() {
 console.log(this.length); // 出力 }

定数オブジェクト = {
 長さ: 5,
 方法() {
 引数[0]();
 }
};

オブジェクト.メソッド(コールバック、1、2);

答え:

出力: 3

obj.method(callback, 1, 2) は、callback、1、2 の 3 つの引数で呼び出されます。結果の method() 内の arguments 特殊変数は、次の構造を持つ配列のようなオブジェクトです。

{
 0: コールバック、
 1: 1、 
 22、 
 長さ: 3 
}

arguments[0]() は arguments オブジェクトのコールバックのメソッド呼び出しなので、コールバック内の this は arguments と等しくなります。その結果、callback() 内の this.length と arguments.length は同じになり、両方とも 3 になります。

要約する

5 問以上正解した場合は、このキーワードをかなりよく理解していることになります。

これで、JS 面接の 7 つの質問に関するこの記事は終了です。JS 面接の質問に関するより関連性の高い質問については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 関数の分類の詳細な説明とJavascriptでのこのポイントの例
  • JavaScript関数におけるこのポイントの問題の詳細な説明
  • JavaScriptにおけるこのポインティング問題の詳細な説明
  • JavaScriptのポイントごとのシリーズでこれは何ですか
  • JavaScript における this ポイントの問題の詳細な説明

<<:  MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

>>:  CentOs でノード バージョンを手動でアップグレードする方法

推薦する

ネイティブ JS でスネーク ゲームを書く

この記事では、参考までに、JSでスネークゲームを書くための具体的なコードを紹介します。具体的な内容は...

GoogleとFacebookがDockerを使わない理由

この記事を書いた理由は、修正した分散 PyTorch プログラムを Facebook のクラスター上...

Kubernetes オブジェクトボリュームの詳細な使用方法

概要ボリュームは、さまざまなストレージ リソースを抽象化および仮想化したものです。ストレージ リソー...

システム CD をマウントして yum ウェアハウスを構築する VMware 15.5 バージョンのグラフィック チュートリアル

1. CentOS 7 仮想マシンを開きます。 2. 仮想マシンにログインし、リストにないユーザー名...

ボタンの 4 つのクリック応答方法の概要

ボタンは頻繁に使用されます。ここでは、イベント処理メソッドを整理し、実装方法が多数あることを発見しま...

HTML 要素の高さ、offsetHeight、clientHeight、scrollTop などの詳細な説明。

要素に関するいくつかの属性フロントエンドの日常的な開発では、一部のページのプロパティを取得または監視...

MySQL データベース シェル import_table データ インポート

目次MySQL Shell import_table データのインポート1. import_tabl...

MySQL 集計統計データの低速クエリの最適化

前面に書かれた注文テーブル、アクセス記録テーブル、商品テーブルなど、日常生活でデータベースを操作する...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

Nginx プロキシ使用時にヘッダーに「_」が含まれることで情報が失われる問題の解決方法

序文ゲートウェイプロジェクトを開発する場合、署名 sign_key 情報はリクエスト時にリクエスト ...

Vue-pdfはPDFファイルのオンラインプレビューを実装します

序文ほとんどのプロジェクトでは、PDF ファイルのオンライン プレビューに遭遇するでしょう。このプロ...

Linux で指定された期間に数分ごとにタスク スケジュール crontab を自動的に実行する方法

まずコードを見てみましょう #/bin/sh datename=$(日付 +%Y%m%d-%H%M%...

MySQL操作テーブルでよく使われるSQLのまとめ

1. テーブル内のフィールドの種類を表示する テーブル名を記述する desc テーブル名 2. テー...

MySQL クラスタの詳細な説明: 1 つのマスターと複数のスレーブのアーキテクチャ実装

実験環境: 1. CentOS 7 サーバー 3 台2. mysql5.7.26 (3台のマシンはす...

アコーディオン効果を実現するネイティブ js

実際のWebページ開発でも、アコーディオンは頻繁に登場します。簡単なアコーディオンを作ったのですが、...