JavaScript は、最新のすべてのブラウザの公用語です。その結果、開発者インタビューでは JavaScript に関する質問がさまざまな言語で行われます。
この記事では、最新の JavaScript ライブラリ、一般的な開発手法、または新しい ES6 関数 については説明しません。その代わりに、面接でよく聞かれる JavaScript に関する 3 つの質問について話しましょう。私がこれらの質問をしたところ、友達も同じように質問したと言っていました。
もちろん、JavaScript の面接の準備をするときに、これら 3 つの質問だけを学べばよいというわけではありません。次の面接に向けてよりよく準備する方法はまだたくさんあります。しかし、面接官はおそらく次の点であなたの理解度を判断します。 3 つの質問と JavaScript と DOM の習得。
始めましょう!以下の例ではネイティブ JavaScript を使用していることに注意してください。面接官は通常、ライブラリ (jQuery など) の助けを借りずに、あなたが JavaScript と DOM をどの程度理解しているかをテストしたいと考えているからです。
質問 1: イベント プロキシ
アプリケーションを作成するとき、ページ上のボタン、テキスト、または画像にイベント リスナーを追加し、ユーザーがこれらの要素を操作するときに特定のアクションをトリガーする必要がある場合があります。
例として、単純な To-Do リストを考えてみましょう。面接官は、ユーザーがリスト内の項目をクリックしたときにアクションをトリガーしたいと伝えます。そして、JavaScript を使用して、次の HTML コードに従ってこの関数を実装しましょう:
<ul id="todo-app"> <li class="item">Walk the dog</li> <li class="item">Pay bills</li> <li class="item">Make dinner</li> <li class="item">Code for one hour</li> </ul>
次のコードのようにイベント リスナーを要素に追加できます:
document.addEventListener('DOMContentLoaded', function() { let app = document.getElementById('todo-app'); let items = app.getElementsByClassName('item'); // 给每个列表项添加事件监听器 for (let item of items) { item.addEventListener('click', function() { alert('you clicked on item: ' + item.innerHTML); }); } });
もちろん、上記のコードは面接官のニーズを満たすことができます。つまり、各リスト項目にはイベント リスナーが追加されます。リストに項目が 4 つしかない場合は問題ありませんが、誰かが To Do リスト に 10,000 項目を追加した場合はどうなるでしょうか (おそらく、やるべきことが山ほどあるでしょう)。その時点で、関数は 10,000 個のイベント リスナーを作成し、それらすべてを DOM に追加します。この効率は非常に低いです。
面接中、最初に、ユーザーが追加できる To Do アイテムの数を最大でいくつまで面接官に尋ねるのが最善です。 10 を超えることがない場合、上記のコードは問題なく実行されます。しかし、ユーザーが入力できる To Do 項目の数に制限がない場合は、より効率的なソリューションを見つける必要があります。 アプリケーションに何百ものイベント リスナーがある場合、より効率的な解決策は、最も外側のコンテナにイベント リスナーを追加し、ユーザーが実際にクリックしたときに実際にクリックされた To Do 項目を取得することです。これはイベント デリゲートと呼ばれ、各 To Do アイテムに個別のイベント リスナーを追加するよりも効率的です。
イベント デリゲートのコードは次のとおりです:document.addEventListener('DOMContentLoaded', function() { let app = document.getElementById('todo-app'); // 给容器添加事件监听器 app.addEventListener('click', function(e) { if (e.target && e.target.nodeName === 'LI') { let item = e.target; alert('you clicked on item: ' + item.innerHTML); } }); });質問 #2: ループ内でクロージャを使用する面接官はこの質問への回答を通じてあなたの言語への精通度を判断できるため、クロージャは面接でよく質問されます。クロージャをいつ使用するかがわかります。 クロージャは、スコープ外の
変数にアクセスできる内部関数です。クロージャを使用して、民営化を実装し、ファクトリ機能を作成できます。クロージャに関するよくあるインタビューの質問は次のとおりです:
整数配列をループし、3秒の遅延で配列内の各要素のインデックスを出力する関数を作成してください。 この問題の一般的な (間違った) 実装は次のとおりです:
const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(function() { console.log('The index of this number is: ' + i); }, 3000); }
この関数を実行すると、3 秒後に毎回
4が、予想される 0, 1, 2 , の代わりに出力されることがわかります。 3。 この状況の理由を正しく見つけるには、JavaScript がこのコードをどのように実行するかを理解する必要があります。これが面接官があなたを調べたいことです。
その理由は、setTimeout 関数が外側のスコープ、つまりインデックス i を含むループにアクセスする関数 (クロージャ) を作成するためです。 3 秒後、関数は i の値の出力を開始し、ループはこの時点で終了します。i の値はすでに 4 です。 0、1、2、3、4とループして、最終的に4で止まるからです。
この問題を正しく解決するには、実際にはいくつかの方法があります。
const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { // 给每个函数传入变量 i 让其能访问正确的索引 setTimeout(function(i_local) { return function() { console.log('The index of this number is: ' + i_local); } }(i), 3000); }
const arr = [10, 12, 15, 21]; for (let i = 0; i < arr.length; i++) { // 使用 ES6 中的 let 关键字,它会在函数调用时创建一个新的绑定 // 了解更多:http://exploringjs.com/es6/ch_variables.html#sec_let-const-loop-heads setTimeout(function() { console.log('The index of this number is: ' + i); }, 3000); }
問題 #3: デバウンス
一部のブラウザ イベント (ウィンドウのサイズ変更やページのスクロールなど) は、短期間に複数回トリガーされる可能性があります。ウィンドウ スクロール イベントにイベント リスナーを追加し、ユーザーがページを素早くスクロールし続けると、イベントが 3 秒間に数千回発生する可能性があります。これにより、非常に深刻なパフォーマンスの問題が発生する可能性があります。
インタビューでアプリケーションの構築やスクロール イベント、ウィンドウのサイズ変更イベント、キーボード イベントなどについて議論する場合は、ページの速度とパフォーマンスを向上させる方法としてデバウンスまたはスロットルについて必ず言及してください。 CSS トリックの例を見てみましょう:
2011 年、Twitter には問題がありました。Twitter の概要をスクロールすると、ページが非常に動かなくなったり、応答しなくなったりすることがありました。 John Resig はこの問題についてブログを書き、時間のかかる関数をスクロール イベントに直接バインドすることがいかに悪い考えであるかを説明しました。
Debouncing 是解决这个问题的一种方法,它的做法是限制下次函数调用之前必须等待的时间间隔。正确实现 debouncing 的方法是将若干个函数调用 合成 一次,并在给定时间过去之后仅被调用一次。下面是一个原生 JavaScript 的实现,用到了 作用域 , 闭包, this , 和 计时事件 :
// 将会包装事件的 debounce 函数 function debounce(fn, delay) { // 维护一个 timer let timer = null; // 能访问 timer 的闭包 return function() { // 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量 let context = this; let args = arguments; // 如果事件被调用,清除 timer 然后重新设置 timer clearTimeout(timer); timer = setTimeout(function() { fn.apply(context, args); }, delay); } }
这个函数 — 当传入一个事件(fn)时 — 会在经过给定的时间(delay)后执行。
函数这样用:
// 当用户滚动时被调用的函数 function foo() { console.log('You are scrolling!'); } // 在 debounce 中包装我们的函数,过 2 秒触发一次 let elem = document.getElementById('container'); elem.addEventListener('scroll', debounce(foo, 2000));
Throttling 是与 debouncing 类似的一种技术,但它不是在调用函数之前等待一段时间,throttling 是在较长的时间间隔内调用函数。所以如果一个事件每 100 毫秒被触发 10 次,throttling 会在每隔 2 秒时执行一次这个函数,而不是在 100 毫秒内执行 10 次事件。
以上が注意すべき 3 つの JavaScript 面接の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ホットトピック









