国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目次
#メモリ リークとは、ソフトウェアによって再利用できない、割り當てられたメモリのブロックです。
について説明しました。次に、addEventListener を見てみましょう。
4. Window Object
5. 持有DOM引用
總結(jié)
ホームページ ウェブフロントエンド jsチュートリアル 5 つの一般的な JavaScript メモリ エラー

5 つの一般的な JavaScript メモリ エラー

Aug 25, 2022 am 10:27 AM
javascript フロントエンド typescript

5 つの一般的な JavaScript メモリ エラー

#JavaScript はメモリ管理操作を提供しません。代わりに、メモリは、ガベージ コレクションと呼ばれるメモリ再利用プロセスを通じて JavaScript VM によって管理されます。 [関連する推奨事項:

JavaScript 學習チュートリアル]ガベージ コレクションを強制することはできないので、ガベージ コレクションが適切に機能することをどのように確認すればよいでしょうか?私たちはそれについてどれくらい知っていますか?

このプロセス中はスクリプトの実行が一時停止されます

    アクセスできないリソースのメモリが解放されます
  • 未定義です
  • メモリ全體をチェックするわけではありません
  • これは予測不可能ですが、必要に応じて実行されます
  • これは、リソースとメモリの分散の問題を心配する必要がないことを意味しますか? もちろんそうではありません。注意しないと、メモリ リークが発生する可能性があります。

#メモリ リークとは何ですか?

#メモリ リークとは、ソフトウェアによって再利用できない、割り當てられたメモリのブロックです。

Javascript はガベージ コレクターを提供しますが、これはメモリ リークを回避できることを意味するものではありません。ガベージ コレクションの対象となるには、オブジェクトが他の場所で參照されていてはなりません。未使用のリソースへの參照を保持すると、それらのリソースが再利用されなくなります。これは、無意識の記憶保持と呼ばれます。

メモリのリークにより、ガベージ コレクターがより頻繁に実行される可能性があります。このプロセスによりスクリプトの実行が妨げられるため、プログラムがフリーズする可能性があります。このような遅延が発生すると、うるさいユーザーは、満足できない場合は製品が長時間オフラインになることに間違いなく気づくでしょう。さらに深刻なことに、アプリケーション全體がクラッシュする可能性があります。これは gg です。 メモリ リークを防ぐにはどうすればよいでしょうか? 重要なのは、不必要なリソースを保持しないようにすることです。いくつかの一般的なシナリオを見てみましょう。

1. タイマー監(jiān)視

setInterval() メソッドは、一定の間隔で関數(shù)を呼び出すか、コード フラグメントを?qū)g行します。遅れ。間隔を一意に識別する間隔

ID

が返されるため、後で clearInterval() を呼び出して削除できます。 # ループの後に完了したことを示すコールバック関數(shù)を呼び出すコンポーネントを作成します。この例では React を使用していますが、これはどの FE フレームワークでも機能します。 <pre class="brush:php;toolbar:false">import?React,?{?useRef?}?from?'react'; const?Timer?=?({?cicles,?onFinish?})?=&gt;?{ ????const?currentCicles?=?useRef(0); ????setInterval(()?=&gt;?{ ????????if?(currentCicles.current?&gt;=?cicles)?{ ????????????onFinish(); ????????????return; ????????} ????????currentCicles.current++; ????},?500); ????return?( ????????&lt;p&gt;Loading?...&lt;/p&gt; ????); } export?default?Timer;</pre>一見すると問題ないようです。心配しないで、このタイマーをトリガーする別のコンポーネントを作成し、そのメモリ パフォーマンスを分析しましょう。

import?React,?{?useState?}?from?'react';
import?styles?from?'../styles/Home.module.css'
import?Timer?from?'../components/Timer';

export?default?function?Home()?{
????const?[showTimer,?setShowTimer]?=?useState();
????const?onFinish?=?()?=>?setShowTimer(false);

????return?(
??????<p>
??????????{showTimer???(
??????????????<timer></timer>
??????????):?(
??????????????<button>?setShowTimer(true)}>
????????????????Retry
??????????????</button>
??????????)}
??????</p>
????)
}

Retry ボタンを數(shù)回クリックした後、Chrome デベロッパー ツールを使用してメモリ使用量を取得した結(jié)果が次のとおりです:

再試行ボタンをクリックすると、より多くのメモリが割り當てられることがわかります。これは、以前に割り當てられたメモリが解放されていないことを意味します。タイマーは交換されずにまだ動作しています。

この問題を解決するにはどうすればよいですか?

setInterval5 つの一般的な JavaScript メモリ エラー の戻り値は間隔 ID であり、この間隔をキャンセルするために使用できます。この特定のケースでは、コンポーネントがアンロードされた後に

clearInterval

を呼び出すことができます。

useEffect(()?=>?{
????const?intervalId?=?setInterval(()?=>?{
????????if?(currentCicles.current?>=?cicles)?{
????????????onFinish();
????????????return;
????????}
????????currentCicles.current++;
????},?500);

????return?()?=>?clearInterval(intervalId);
},?[])

コードを作成するときにこの問題を見つけるのが難しい場合がありますが、最善の方法はコンポーネントを抽象化することです。 ここでは React が使用されており、このロジックすべてをカスタム フックにラップできます。 <pre class="brush:php;toolbar:false">import?{?useEffect?}?from?'react'; export?const?useTimeout?=?(refreshCycle?=?100,?callback)?=&gt;?{ ????useEffect(()?=&gt;?{ ????????if?(refreshCycle??{ ????????????callback(); ????????},?refreshCycle); ????????return?()?=&gt;?clearInterval(intervalId); ????},?[refreshCycle,?setInterval,?clearInterval]); }; export?default?useTimeout;</pre>

setInterval

を使用する必要がある場合は、次のようにすることができます:

const?handleTimeout?=?()?=>?...;

useTimeout(100,?handleTimeout);

これで、心配することなく、この

useTimeout フック

を使用できるようになります。メモリのリークについてですが、これも抽象化の利點です。

2. イベント リスニング

Web API は多數(shù)のイベント リスナーを提供します。前に、

setTimeout

について説明しました。次に、addEventListener を見てみましょう。

この例では、キーボード ショートカット関數(shù)を作成します。さまざまなページにさまざまな機能があるため、さまざまなショートカット キー機能が作成されます。 <pre class="brush:php;toolbar:false">function?homeShortcuts({?key})?{ ????if?(key?===?'E')?{ ????????console.log('edit?widget') ????} } //?用戶在主頁上登陸,我們執(zhí)行 document.addEventListener('keyup',?homeShortcuts);? //?用戶做一些事情,然后導(dǎo)航到設(shè)置 function?settingsShortcuts({?key})?{ ????if?(key?===?'E')?{ ????????console.log('edit?setting') ????} } //?用戶在主頁上登陸,我們執(zhí)行 document.addEventListener('keyup',?settingsShortcuts);</pre> は、2 番目の addEventListener を?qū)g行する前にクリーンアップがないことを除けば、問題ないようです。

keyup## #。このコードは、

keyup

リスナーを置き換えるのではなく、別の

callback を追加します。これは、キーが押されると 2 つの機能がトリガーされることを意味します。 前のコールバックをクリアするには、removeEventListener :

document.removeEventListener(‘keyup’,?homeShortcuts);
上記のコードをリファクタリングする必要があります:
function?homeShortcuts({?key})?{
????if?(key?===?'E')?{
????????console.log('edit?widget')
????}
}

//?user?lands?on?home?and?we?execute
document.addEventListener('keyup',?homeShortcuts);?


//?user?does?some?stuff?and?navigates?to?settings

function?settingsShortcuts({?key})?{
????if?(key?===?'E')?{
????????console.log('edit?setting')
????}
}

//?user?lands?on?home?and?we?execute
document.removeEventListener('keyup',?homeShortcuts);?
document.addEventListener('keyup',?settingsShortcuts);
経験によれば、from を使用する場合は、グローバル オブジェクト ツールを使用する場合は、細心の注意を払ってください。

3.Observers

Observers

は、多くの開発者が知らないブラウザの Web API 関數(shù)です。これは、HTML 要素の可視性やサイズの変更を確認する場合に強力です。

IntersectionObserver接口 (從屬于Intersection Observer API) 提供了一種異步觀察目標元素與其祖先元素或頂級文檔視窗(viewport)交叉狀態(tài)的方法。祖先元素與視窗(viewport)被稱為根(root)。

盡管它很強大,但我們也要謹慎的使用它。一旦完成了對對象的觀察,就要記得在不用的時候取消它。

看看代碼:

const?ref?=?...
const?visible?=?(visible)?=>?{
??console.log(`It?is?${visible}`);
}

useEffect(()?=>?{
????if?(!ref)?{
????????return;
????}

????observer.current?=?new?IntersectionObserver(
????????(entries)?=>?{
????????????if?(!entries[0].isIntersecting)?{
????????????????visible(true);
????????????}?else?{
????????????????visbile(false);
????????????}
????????},
????????{?rootMargin:?`-${header.height}px`?},
????);

????observer.current.observe(ref);
},?[ref]);

上面的代碼看起來不錯。然而,一旦組件被卸載,觀察者會發(fā)生什么?它不會被清除,那內(nèi)存可就泄漏了。我們怎么解決這個問題呢?只需要使用 disconnect 方法:

const?ref?=?...
const?visible?=?(visible)?=>?{
??console.log(`It?is?${visible}`);
}

useEffect(()?=>?{
????if?(!ref)?{
????????return;
????}

????observer.current?=?new?IntersectionObserver(
????????(entries)?=>?{
????????????if?(!entries[0].isIntersecting)?{
????????????????visible(true);
????????????}?else?{
????????????????visbile(false);
????????????}
????????},
????????{?rootMargin:?`-${header.height}px`?},
????);

????observer.current.observe(ref);

????return?()?=>?observer.current?.disconnect();
},?[ref]);

4. Window Object

向 Window 添加對象是一個常見的錯誤。在某些場景中,可能很難找到它,特別是在使用 Window Execution上下文中的this關(guān)鍵字??纯聪旅娴睦樱?/p>

function?addElement(element)?{
????if?(!this.stack)?{
????????this.stack?=?{
????????????elements:?[]
????????}
????}

????this.stack.elements.push(element);
}

它看起來無害,但這取決于你從哪個上下文調(diào)用addElement。如果你從Window Context調(diào)用addElement,那就會越堆越多。

另一個問題可能是錯誤地定義了一個全局變量:

var?a?=?'example?1';?//?作用域限定在創(chuàng)建var的地方
b?=?'example?2';?//?添加到Window對象中

要防止這種問題可以使用嚴格模式:

"use?strict"

通過使用嚴格模式,向JavaScript編譯器暗示,你想保護自己免受這些行為的影響。當你需要時,你仍然可以使用Window。不過,你必須以明確的方式使用它。

嚴格模式是如何影響我們前面的例子:

  • 對于 addElement 函數(shù),當從全局作用域調(diào)用時,this 是未定義的
  • 如果沒有在一個變量上指定const | let | var,你會得到以下錯誤:
Uncaught?ReferenceError:?b?is?not?defined

5. 持有DOM引用

DOM節(jié)點也不能避免內(nèi)存泄漏。我們需要注意不要保存它們的引用。否則,垃圾回收器將無法清理它們,因為它們?nèi)匀皇强稍L問的。

用一小段代碼演示一下:

const?elements?=?[];
const?list?=?document.getElementById('list');

function?addElement()?{
????//?clean?nodes
????list.innerHTML?=?'';

????const?pElement=?document.createElement('p');
????const?element?=?document.createTextNode(`adding?element?${elements.length}`);
????pElement.appendChild(element);


????list.appendChild(pElement);
????elements.push(pElement);
}

document.getElementById('addElement').onclick?=?addElement;

注意,addElement 函數(shù)清除列表 p,并將一個新元素作為子元素添加到它中。這個新創(chuàng)建的元素被添加到 elements 數(shù)組中。

下一次執(zhí)行 addElement 時,該元素將從列表 p 中刪除,但是它不適合進行垃圾收集,因為它存儲在 elements 數(shù)組中。

我們在執(zhí)行幾次之后監(jiān)視函數(shù):

5 つの一般的な JavaScript メモリ エラー

在上面的截圖中看到節(jié)點是如何被泄露的。那怎么解決這個問題?清除 elements ?數(shù)組將使它們有資格進行垃圾收集。

總結(jié)

在這篇文章中,我們已經(jīng)看到了最常見的內(nèi)存泄露方式。很明顯,JavaScript本身并沒有泄漏內(nèi)存。相反,它是由開發(fā)者方面無意的內(nèi)存保持造成的。只要代碼是整潔的,而且我們不忘自己清理,就不會發(fā)生泄漏。

了解內(nèi)存和垃圾回收在JavaScript中是如何工作的是必須的。一些開發(fā)者得到了錯誤的意識,認為由于它是自動的,所以他們不需要擔心這個問題。

作者: Jose Granja?

原文:https://betterprogramming.pub/5-common-javascript-memory-mistakes-c8553972e4c2

(學習視頻分享:web前端

以上が5 つの一般的な JavaScript メモリ エラーの詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ Mar 16, 2024 pm 12:09 PM

PHP と Vue: フロントエンド開発ツールの完璧な組み合わせ 今日のインターネットの急速な発展の時代において、フロントエンド開発はますます重要になっています。 Web サイトやアプリケーションのエクスペリエンスに対するユーザーの要求がますます高まっているため、フロントエンド開発者は、より効率的で柔軟なツールを使用して、応答性の高いインタラクティブなインターフェイスを作成する必要があります。フロントエンド開発の分野における 2 つの重要なテクノロジーである PHP と Vue.js は、組み合わせることで完璧なツールと見なされます。この記事では、PHP と Vue の組み合わせと、読者がこれら 2 つをよりよく理解し、適用できるようにするための詳細なコード例について説明します。

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン Mar 28, 2024 pm 01:06 PM

Go 言語は、高速で効率的なプログラミング言語として、バックエンド開発の分野で広く普及しています。ただし、Go 言語をフロントエンド開発と結(jié)びつける人はほとんどいません。実際、フロントエンド開発に Go 言語を使用すると、効率が向上するだけでなく、開発者に新たな視野をもたらすことができます。この記事では、フロントエンド開発に Go 言語を使用する可能性を探り、読者がこの分野をよりよく理解できるように具體的なコード例を示します。従來のフロントエンド開発では、ユーザー インターフェイスの構(gòu)築に JavaScript、HTML、CSS がよく使用されます。

Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Django はフロントエンドですか、バックエンドですか?それをチェックしてください! Jan 19, 2024 am 08:37 AM

Django は、迅速な開発とクリーンなメソッドを重視した Python で書かれた Web アプリケーション フレームワークです。 Django は Web フレームワークですが、Django がフロントエンドなのかバックエンドなのかという質(zhì)問に答えるには、フロントエンドとバックエンドの概念を深く理解する必要があります。フロントエンドはユーザーが直接対話するインターフェイスを指し、バックエンドはサーバー側(cè)プログラムを指し、HTTP プロトコルを通じてデータと対話します。フロントエンドとバックエンドが分離されている場合、フロントエンドとバックエンドのプログラムをそれぞれ獨立して開発して、ビジネス ロジックとインタラクティブ効果、およびデータ交換を?qū)g裝できます。

フロントエンドの面接官からよく聞かれる質(zhì)問 フロントエンドの面接官からよく聞かれる質(zhì)問 Mar 19, 2024 pm 02:24 PM

フロントエンド開発のインタビューでは、HTML/CSS の基本、JavaScript の基本、フレームワークとライブラリ、プロジェクトの経験、アルゴリズムとデータ構(gòu)造、パフォーマンスの最適化、クロスドメイン リクエスト、フロントエンド エンジニアリング、デザインパターン、新しいテクノロジーとトレンド。面接官の質(zhì)問は、候補者の技術(shù)スキル、プロジェクトの経験、業(yè)界のトレンドの理解を評価するように設(shè)計されています。したがって、候補者はこれらの分野で自分の能力と専門知識を証明するために十分な準備をしておく必要があります。

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Jan 19, 2024 am 08:52 AM

Django: フロントエンド開発とバックエンド開発の両方を処理できる魔法のフレームワークです。 Django は、効率的でスケーラブルな Web アプリケーション フレームワークです。 MVCやMTVなど複數(shù)のWeb開発モデルをサポートし、高品質(zhì)なWebアプリケーションを簡単に開発できます。 Django はバックエンド開発をサポートするだけでなく、フロントエンド インターフェイスを迅速に構(gòu)築し、テンプレート言語を通じて柔軟なビュー表示を?qū)g現(xiàn)します。 Django はフロントエンド開発とバックエンド開発をシームレスに統(tǒng)合するため、開発者は學習に特化する必要がありません。

Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たすかを探る Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たすかを探る Mar 19, 2024 pm 06:15 PM

Golang とフロントエンド テクノロジーの組み合わせ: Golang がフロントエンド分野でどのような役割を果たしているかを調(diào)べるには、具體的なコード例が必要です。インターネットとモバイル アプリケーションの急速な発展に伴い、フロントエンド テクノロジーの重要性がますます高まっています。この分野では、強力なバックエンド プログラミング言語としての Golang も重要な役割を果たします。この記事では、Golang がどのようにフロントエンド テクノロジーと組み合わされるかを検討し、具體的なコード例を通じてフロントエンド分野での可能性を?qū)g証します。フロントエンド分野における Golang の役割は、効率的で簡潔かつ學びやすいものとしてです。

Reactの主要な機能を理解する:フロントエンドの視點 Reactの主要な機能を理解する:フロントエンドの視點 Apr 18, 2025 am 12:15 AM

Reactの主な機能には、コンポーネント思考、國家管理、仮想DOMが含まれます。 1)コンポーネント化のアイデアにより、UIを再利用可能な部分に分割して、コードの読みやすさと保守性を向上させることができます。 2)狀態(tài)管理は、狀態(tài)および小道具を通じて動的データを管理し、変更を変更しますUIの更新をトリガーします。 3)仮想DOM最適化パフォーマンス、メモリ內(nèi)のDOMレプリカの最小操作の計算を通じてUIを更新します。

フロントエンドとバックエンドとはどういう意味ですか? フロントエンドとバックエンドとはどういう意味ですか? Mar 19, 2024 am 11:20 AM

違い: フロントエンドは、ユーザーがブラウザーで見る Web ページ、畫像、その他のコンテンツなどのユーザー インターフェイスの設(shè)計と操作を擔當します。バックエンドは、データの処理と、サーバー側(cè)のスクリプト、データベース、API などの論理操作の実行を擔當します。

See all articles