JavaScript は、最新のすべてのブラウザーの公式言語です。そのため、JavaScript に関する質問はさまざまな開発者インタビューで取り上げられます。この記事では主に次の内容を共有します。 JavaScript でよくある 3 つの面接の質問を一緒に見てみましょう
この記事は最新の JavaScript ライブラリに関するものではありません。 -日の開発実践や ES6 の新しい機能 代わりに、これら 3 つの質問は、私自身も面接でよく聞かれましたし、私の友人からも聞かれたことがあると聞きました
もちろん、そうすべきです。 JavaScript の面接前にこれら 3 つの質問を学習するだけではありません。次の面接に向けてより良い準備をする方法はたくさんあります。ただし、ここでは面接官が尋ねる可能性のある 3 つの質問を紹介します。JavaScript 言語の理解と DOM の習熟度を判断してください。始めましょう!面接官は通常、サードパーティのライブラリを使用しているかどうかを確認したいと考えているため、以下の例ではネイティブ JavaScript を使用していることに注意してください ( を使用して JavaScript と DOM を理解する方法) jQuery
)注: イベント委任、時間委任などとも呼ばれます
アプリケーションを構築する場合、イベント リスナーをボタンにバインドする必要がある場合があります。ユーザーが要素を操作するときに何らかのアクションを実行するためにページ上にテキストまたは画像を追加します単純な ToDo リストを例に挙げると、担当者は、次のときに何らかのアクションを実行したいと伝えるかもしれません。ユーザーはリスト項目の 1 つをクリックします
HTML コードが次のようになっていると仮定して、この関数を JavaScript で実装してほしいと考えています:
<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 つの要素である各リスト項目にイベント リスナーを個別にバインドしていることです。ただし、10,000 個の項目が ToDo リストに追加された場合はどうなるでしょうか。おそらくやるべきことがたくさんあるでしょう) その場合、関数は 10,000 個の個別のイベント リスナーを作成し、それぞれを DOM にバインドします
面接では、最初に最大値を尋ねる方が良いでしょう。ただし、ユーザーが入力できる項目の数に制限はないため、アプリケーションに数百もの項目が入力される可能性がある場合は、より効率的なソリューションを使用する必要があります。イベント リスナーを使用する場合、より効率的な解決策は、実際に 1 つのイベント リスナーをコンテナ全体にバインドし、実際のクリックで各要素にアクセスできるようにすることです。これはイベント委任と呼ばれ、各要素を個別にバインドしてイベント処理をより効率的にします。
イベント委任を使用したコード: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); } }); });
クロージャは、面接官があなたの言語の知識を評価できるように、また、いつ使用するかを知ることができるように、面接で頻繁に登場します。閉鎖。 クロージャの本質は、
内部関数がスコープ外の変数にアクセスすることです。クロージャを使用すると、プライベート変数やファクトリ関数の作成などを実装できます。クロージャの使用に関する一般的なインタビューの質問は次のとおりです: 整数のリストをループし、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 の値が出力されます。ループ サイクルは 0、1、2、3、4 を通過し、ループは最終的に 4 で停止するため、ループの最後では 4 になります。この問題を解決するには、実際にはいくつかの正しい記述方法があります。以下に 2 つあります:
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秒的范围内被触发数千次。这可能会导致一些严重的性能问题。
如果你在面试中讨论构建应用程序和事件,如滚动,窗口调整大小,或键盘按下的事件时,请务必提及 函数防抖动(Debouncing) 和/或 函数节流(Throttling)来提升页面速度和性能。一个真实的案例,来自 guest post on css-tricks:
在2011年,一个问题在Twitter上被提出:当你滚动Twitter feed时,它会会变得非常慢甚至未响应。John Resig 就这个问题发布了一篇博文,它解释了直接绑定函数到scroll事件上是多么糟糕的事。
函数防抖动(Debouncing) 是解决这个问题的一种方式,通过限制需要经过的时间,直到再次调用函数。一个正确实现函数防抖的方法是:把多个函数放在一个函数里调用,隔一定时间执行一次。这里有一个使用原生JavaScript实现的例子,用到了作用域、闭包、this和定时事件:
// debounce函数用来包裹我们的事件 function debounce(fn, delay) { // 持久化一个定时器 timer let timer = null; // 闭包函数可以访问 timer return function() { // 通过 'this' 和 'arguments' // 获得函数的作用域和参数 let context = this; let args = arguments; // 如果事件被触发,清除 timer 并重新开始计时 clearTimeout(timer); timer = setTimeout(function() { fn.apply(context, args); }, delay); } }
当这个函数绑定在一个事件上,只有经过一段指定的时间后才会被调用。
你可以像这样去使用这个函数:
// 当用户滚动时函数会被调用 function foo() { console.log('You are scrolling!'); } // 在事件触发的两秒后,我们包裹在debounce中的函数才会被触发 let elem = document.getElementById('container'); elem.addEventListener('scroll', debounce(foo, 2000));
函数节流是另一个类似函数防抖的技巧,除了使用等待一段时间再调用函数的方法,函数节流还限制固定时间内只能调用一次。所以一个事件如果在100毫秒内发生10次,函数节流会每2秒调用一次函数,而不是100毫秒内全部调用。
总结
以上がJavaScript で最も一般的な 3 つの問題の詳細なコード説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

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

Dreamweaver Mac版
ビジュアル Web 開発ツール
