JavaScriptのeval関数を使用することが悪い考えなのはなぜですか?


534

eval関数は、コードを動的に生成するための強力で簡単な方法なので、警告は何ですか?



5
moduscreate.com/javascript-performance-tips-tricksで概説されているように -(new Function(str))()はeval(str)よりもパフォーマンスが優れています。ちょうど私の2セント:)
Grgur

3
明らかに、新しいfcuntion(a)は、Chromeのeval(a)より67%遅い
スリープとは何

私にとって、新しい関数(a)は、osxでの最新のクロームが80%遅い
ジョン・スミス

3
パフォーマンスを比較するためだけに、静的関数を追加しました。jsperf.com/eval-vs-new-function/2
Nepoxx

回答:


386
  1. evalを不適切に使用すると、インジェクション攻撃のコードが開かれます

  2. デバッグはより困難になる可能性があります(行番号なしなど)

  3. eval'dコードの実行が遅くなる(eval'dコードをコンパイル/キャッシュする機会がない)

編集:@Jeff Waldenがコメントで指摘しているように、今日の#3は2008年よりも真実ではありません。ただし、コンパイルされたスクリプトの一部のキャッシュが発生する可能性がありますが、これは変更なしで繰り返し評価されたスクリプトに限定されます。より可能性の高いシナリオは、毎回わずかな変更が加えられたためにキャッシュできなかったスクリプトを評価している場合です。いくつかの評価済みコードの実行速度が遅いとしましょう。


2
@JeffWalden、素晴らしいコメント。投稿してから1年が経過しているようですが、投稿を更新しました。Xnzo72、もしあなたがあなたのコメントを(ジェフがしたように)いくらか修飾したならば、私はあなたに同意することができるかもしれません。Jeffはキーを指摘しました:「同じ文字列を複数回評価することで、解析のオーバーヘッドを回避できます」。現状では、あなたはただ間違っています。#3は多くのシナリオに当てはまります。
Prestaul

7
@Prestaul:想定される攻撃者はクライアントのJavaScriptを変更するために開発者ツールを使用できるので、なぜEval()がコードをインジェクション攻撃に開放すると言うのですか?まだ開いていませんか?(もちろん、クライアントのJavaScriptについて話している)
Eduardo Molteni

60
@EduardoMolteni、私たちはユーザーが自分のブラウザーでjsを実行することを気にしません(実際に防ぐことはできません)。私たちが回避しようとしている攻撃は、ユーザーが指定した値が保存され、後でJavaScriptに入れられて評価される場合です。たとえば、ユーザー名を次のbadHackerGuy'); doMaliciousThings();ように設定します。ユーザー名を取得してスクリプトに連結し、他のユーザーのブラウザーで評価すると、自分のマシンで任意のJavaScriptを実行できます(たとえば、投稿を+1するように強制します)。私のサーバーなどにデータを投稿するなど)
プレスタウル

3
一般的に、#1は、ほとんどではないにしても、ほとんどの関数呼び出しに当てはまります。経験の浅いプログラマーがeval()を悪用したからといって、経験豊富なプログラマーがeval()を選び出して回避してはなりません。ただし、経験豊富なプログラマーのコードには多くの場合より優れたアーキテクチャーがあり、eval()はめったに必要とされず、この優れたアーキテクチャーによって考慮されることすらありません。
frodeborli 2014年

4
@TamilVendhanもちろん、ブレークポイントを設定できます。debugger;ソースコードにステートメントを追加することにより、評価されたコード用にChromeによって作成された仮想ファイルにアクセスできます。これにより、その行でプログラムの実行が停止します。その後、別のJSファイルのようにデバッグブレークポイントを追加できます。
2014

346

evalは必ずしも悪であるとは限りません。それが完全に適切な場合があります。

ただし、evalは現在および歴史的に、自分が何をしているのかを知らない人々によって大量に過剰に使用されています。これには、残念ながらJavaScriptチュートリアルを書いている人も含まれます。場合によっては、これが実際にセキュリティに影響を及ぼしたり、多くの場合、単純なバグを引き起こしたりすることがあります。したがって、evalに疑問符を付けるためにできることは多ければ多いほど良いです。evalを使用するときはいつでも、何をしているのかを健全性チェックする必要があります。それは、より良く、より安全で、よりクリーンな方法で実行できる可能性があるためです。

あまりにも典型的な例を示すために、変数「potato」に格納されたIDを持つ要素の色を設定するには、次のようにします。

eval('document.' + potato + '.style.color = "red"');

上記の種類のコードの作成者がJavaScriptオブジェクトの動作の基本についての手がかりを持っている場合、evalの必要がなく、リテラルドット名の代わりに角かっこを使用できることに気づいたでしょう。

document[potato].style.color = 'red';

...読みやすく、バグが少ない可能性があります。

(しかし、/ really /が何をしているかを知っている人はこう言うでしょう:

document.getElementById(potato).style.color = 'red';

これは、ドキュメントオブジェクトから直接DOM要素にアクセスするという、おかしな古いトリックよりも信頼性が高くなります。)


82
うーん、私がJavaScriptを最初に学習したときに幸運だったと思います。DOMへのアクセスには常に「document.getElementById」を使用しました。皮肉なことに、JavaScriptでオブジェクトがどのように機能するのか手掛かりがなかったので、私はそのときだけそれをしました;-)
Mike Spross

5
同意する。evalは、
Webサービス

40
@schoetbi:JSONのJSON.parse()代わりに使用すべきではありませんeval()か?
nyuszika7h

4
@bobince code.google.com/p/json-sans-eval、すべてのブラウザで作品をそうgithub.com/douglascrockford/JSON-jsが。Doug Crockfordのjson2.jsは内部でevalを使用しますが、チェックを使用します。さらに、JSONの組み込みブラウザーサポートとの上位互換性があります。
Martijn、2011

8
@bobince不足しているJSONライブラリやその他のものを処理するための機能検出とポリフィルと呼ばれるものがあります(modernizr.comを参照)
MauganRa

37

文字列から任意のJavaScript関数を実行できるためだと思います。これを使用すると、不正なコードをアプリケーションに挿入するのが簡単になります。


5
それでは代替案は何ですか?
モダン

5
本当に代替手段は、それを必要としないコードを書くだけです。Crockfordはこれについて詳しく説明しており、使用する必要がある場合は、プログラムの設計上の欠陥であり、やり直す必要があると彼はよく言っています。実は私も同感です。JSの欠点はすべて非常に柔軟であり、柔軟にするための十分な余地があります。
kemiller2002、2014年

3
真実ではありません。ほとんどのフレームワークにはJSONを解析するメソッドがあり、フレームワークを使用していない場合は、JSON.parse()を使用できます。ほとんどのブラウザーはこれをサポートしており、本当に困った場合は、JSONのパーサーを簡単に作成できます。
kemiller2002、2014年

6
不正なコードをJavascriptアプリケーションに挿入するのはすでに簡単なので、私はこの引数を購入しません。ブラウザコンソール、スクリプト拡張機能などがあります。クライアントに送信されるすべてのコードは、クライアントが実行するオプションです。
user2867288 2015

6
ポイントは、私がブラウザにコードを注入する方が簡単だということです。クエリ文字列でevalを使用しているとしましょう。クエリ文字列が添付されたそのサイトに移動するリンクをクリックするようにあなたを騙した場合、ブラウザーからの完全なアクセス許可でマシン上でコードを実行しました。あなたがそのサイトに入力したすべてをキーログして私に送信したいですか?完了しました。evalが実行されると、ブラウザはそれに最高の権限を与えます。
kemiller2002、2015

27

2つの点が頭に浮かびます:

  1. セキュリティ(ただし、自分で評価する文字列を生成する限り、これは問題ではないかもしれません)

  2. パフォーマンス:実行されるコードが不明になるまで、最適化できません。(javascriptとパフォーマンスについては、確かにSteve Yeggeのプレゼンテーション


9
とにかくクライアントが私たちのコードでやりたいことができれば、なぜセキュリティが問題になるのですか グリースモンキー?
Paul Brewczynski 2013年

2
@PaulBrewczynski、ユーザーAがコードの一部を更新して保存するとセキュリティ上の問題が発生しeval、その小さなコードがユーザーのBブラウザーで実行される
Felipe Pereira

21

ユーザー入力をeval()に渡すことはセキュリティ上のリスクですが、eval()を呼び出すたびにJavaScriptインタープリターの新しいインスタンスが作成されます。これはリソースを独占する可能性があります。


27
私がこれに答えてから3年以上、私が何が起こっているかについての私の理解が深まったとしましょう。実際に発生するのは、新しい実行コンテキストが作成されることです。参照してくださいdmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts
アンドリュー・ヘッジス


16

主に、保守とデバッグがはるかに困難です。のようなものgotoです。あなたはそれを使うことができますが、それは問題を見つけることを難しくし、後で変更を加える必要があるかもしれない人々を難しくします。


Evalは、テンプレートなどの欠落しているメタプログラミング機能を置き換えるために使用できます。私は、関数の無限のリストよりもコンパクトなジェネレーターが好きです。
weaknespase

文字列がユーザーからのものでないか、使用できるブラウザーに限定されている限り。JavaScriptは、プロトタイプの変更、obj [member]、Proxy、json.parse、window、decorator functions(adverbs)などのメタプログラミング能力を備えています。ここで、newf = decorator(oldf)、Array.prototype.map(f)などの高次関数です。 、他の関数に引数を渡す、{}を介してキーワード引数。evalの代わりにこれらを実行できないユースケースを教えてください。
aoeu256

13

心に留めておくべきことの1つは、eval()を使用して、他の制限された環境でコードを実行できることです。特定のJavaScript関数をブロックするソーシャルネットワーキングサイトは、evalブロックに分割することによってだまされる可能性があります-

eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');

そのため、JavaScriptのコードを実行する場合、それが許可されていない可能性がある場合(Myspace、私はあなたを見ている...)、eval()は便利なトリックになる可能性があります。

ただし、上記のすべての理由により、完全に制御できる独自のコードには使用しないでください。必要ないだけでなく、「トリッキーなJavaScriptハッキング」シェルフに委ねられます。


1
上記のコードを更新するだけです。--hi there!-文字列なので、引用符で囲む必要があります。eval( 'al' + 'er' + 't(' + '"こんにちは!"' + ')');
Mahesh、

2
[]["con"+"struc"+"tor"]["con"+"struc"+"tor"]('al' + 'er' + 't(\'' + 'hi there!' + '\')')()
Konrad Borowski、2014

4
はい、alert()を制限し、eval()を許可するソーシャルネットワーキングサイトはありましたか?
joshden

12

(cgiまたは入力を介して)動的コンテンツをeval()に許可しない限り、ページ内の他のすべてのJavaScriptと同じように安全で確実です。


これは本当ですが、コンテンツ動的でない場合、evalを使用する理由は何ですか?代わりに、コードを関数に入れて呼び出すだけです。
Periata Breatta 2016年

たとえば、Ajax呼び出しから返された戻り値(JSONのような、サーバー定義の文字列など)を解析します。
16年

2
ああなるほど。クライアントがそれらが何であるかを事前に知らないので、私はそれらを動的と呼びますが、私はあなたが今何を意味するかを理解しています。
Periata Breatta


6

コードを実行するためのまったく新しいスクリプト環境を作成するため、セキュリティリスクの可能性があり、実行範囲が異なり、非常に非効率的です。詳細については、こちらをご覧ください:eval

ただし、これは非常に便利であり、適度に使用すると、多くの優れた機能を追加できます。


5

評価されるコードが信頼できるソース(通常は独自のアプリケーション)からのものであることを100%確信していない限り、システムをクロスサイトスクリプティング攻撃にさらす確実な方法です。


1
サーバー側のセキュリティに問題がある場合のみ。クライアント側のセキュリティはまったくナンセンスです。
doubleOrt 2017

5

私はこの議論が古いことを知っていますが、Googleによるこのアプローチが本当に好きでその気持ちを他の人と共有したいと思いました;)

他の事は、より良いあなたがより多くのあなたが理解しようと最終的にはあなただけでは何かが誰かがそう言ったからといっ:)これは非常にインスピレーションで良いか悪いかであるとは考えていない得るということであるビデオ私は自分自身でもっと考えるように役立ちました:)良い習慣は良いですが、気にしないでください:)


1
はい。私は、これまでのところ少なくともChromeで、より効率的であると思われるユースケースを見つけました。反復ごとに指定された変数の文字列を評価するRAFを実行します。setIntervalを使用して、その文字列に変換などを設定するなど、グラフィック指向のもののみを設定します。配列内の関数をループする、または変数を使用して変更された要素の変換のみを設定するなど、他の多くのアプローチを試しましたが、これまでのところ、これが最も効率的です。アニメーションについて言えば、真のベンチテストはあなたの目です。
jdmayfield 2018

5

使用しているコンテキストがわかっていれば、必ずしも悪いことではありません。

アプリケーションが、信頼されたサーバー側のコードによって作成されたeval()XMLHttpRequestから独自のサイトに返されたJSONからオブジェクトを作成するために使用している場合は、おそらく問題ありません。

信頼されていないクライアント側のJavaScriptコードは、とにかくそんなに多くはできません。実行eval()しているものが合理的なソースからのものであれば、問題ありません。


3
JSONの解析よりもevalの使用が遅くないですか?
ブレンダンロング

@Qix-ブラウザ(Chrome 53)でテストを実行すると、evalparseよりもいくらか速いことが示されます
Periata Breatta 2016年

@PeriataBreattaふh、おかしい。なんでかしら。当時私はそうではなかったとコメントしました。ただし、バージョン間でランタイムの特定の領域でChromeが奇妙なパフォーマンスの向上を得ることは前例ではありません。
Qix-モニカは

ここで少し古いスレッドですが、私が読んだものから、自分で追跡したとは主張していませんが、JSON.parseは実際にはevalであり、最終段階で入力されています。したがって、効率的には、より多くの作業/時間がかかります。しかし、セキュリティに関しては、なぜ解析しないのでしょうか。evalは素晴らしいツールです。他に方法がないものに使用します。JSONを介して関数を渡すには、evalなしでそれを行う方法があります。JSON.stringifyの2番目のパラメーターを使用すると、typeofを介して関数かどうかを確認できるコールバックを実行できます。次に、関数の.toString()を取得します。あなたが検索すれば、これに関するいくつかの良い記事があります。
jdmayfield 2018


4

ユーザーがいくつかの論理関数を入力してAND ORを評価するようにしたい場合は、JavaScript eval関数が最適です。と2つの文字列を受け入れることができますeval(uate) string1 === string2


Function(){}を使用することもできますが、ユーザーがサーバーを引き継ぐことを望まない限り、サーバーでこれらを使用するときは注意してください。
aoeu256

3

コードでeval()の使用を見つけたら、「eval()は悪である」というスローガンを思い出してください。

この関数は任意の文字列を取り、それをJavaScriptコードとして実行します。問題のコードが事前にわかっている場合(実行時に決定されない)、eval()を使用する理由はありません。コードが実行時に動的に生成される場合、eval()なしで目標を達成するためのより良い方法がしばしばあります。たとえば、動的プロパティにアクセスするために角括弧表記を使用するだけの方が簡単で優れています。

// antipattern
var property = "name";
alert(eval("obj." + property));

// preferred
var property = "name";
alert(obj[property]);

eval()改ざんされたコード(たとえば、ネットワークからのコード)を実行している可能性があるため、使用にはセキュリティ上の影響もあります。これは、AjaxリクエストからのJSONレスポンスを処理する際の一般的なアンチパターンです。そのような場合は、ブラウザーの組み込みメソッドを使用してJSON応答を解析し、安全で有効であることを確認することをお勧めします。サポートしていないブラウザの場合JSON.parse()ネイティブで場合は、JSON.orgのライブラリを使用できます。

それはにその渡す文字列を覚えておくことも重要だsetInterval()setTimeout()Function()コンストラクタが使用するのと同様、ほとんどの部分のために、であるeval()ため、避けるべきです。

JavaScriptは裏側で、プログラミングコードとして渡した文字列を評価および実行する必要があります。

// antipatterns
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// preferred
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);

new Function()コンストラクターの使用はeval()に似ており、注意してアプローチする必要があります。それは強力な構成要素になる可能性がありますが、しばしば誤用されます。どうしても使用する必要がある場合eval()、代わりにnew Function()の使用を検討できます。

new Function()で評価されるコードはローカル関数スコープで実行されるため、評価されるコードでvarを使用して定義された変数が自動的にグローバルになることはないため、小さな潜在的な利点があります。

自動グローバルを防ぐ別の方法は、eval()呼び出しを即時関数にラップする ことです。


evalなしで関数ローカルの動的変数名を評価する方法を提案できますか?評価(および類似の)関数は、それらを含むほとんどの言語で最後の手段ですが、場合によっては必要になります。動的変数の名前を取得する場合、より安全なソリューションはありますか?いずれにせよ、JavaScript自体は実際のセキュリティのためではありません(サーバー側が明らかに主要な防御手段です)。:あなたが興味を持っている場合は、ここで私は変更してみたいのeval、私のユースケースだstackoverflow.com/a/48294208
正規ジョー・

2

ユーザーが送信したコードを実行する場合に起こり得るセキュリティの問題に加えて、ほとんどの場合、実行されるたびにコードを再解析することを含まないより良い方法があります。匿名関数またはオブジェクトプロパティは、evalのほとんどの使用法を置き換えることができ、より安全で高速です。


2

これは、次世代のブラウザーにJavaScriptコンパイラーのいくつかのフレーバーが搭載されるようになると、さらに問題になる可能性があります。Evalを介して実行されるコードは、これらの新しいブラウザーに対してJavaScriptの残りの部分と同じように機能しない場合があります。誰かが何らかのプロファイリングを行うべきです。


2

これはevalとそれが悪ではない方法について話している良い記事の1つです:http : //www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/

どこにでもeval()を使い始める必要があると言っているのではありません。実際、eval()を実行するための良いユースケースはほとんどありません。コードの明快さ、デバッグ可能性、そして確かに見落とされるべきではないパフォーマンスに関する懸念があります。しかし、eval()が理にかなっているケースがある場合、それを使用することを恐れるべきではありません。最初にそれを使用しないようにしてください。ただし、eval()を適切に使用すると、コードの脆弱性や安全性の低下をだれにも怖がらせないでください。


2

eval()は非常に強力であり、JSステートメントの実行や式の評価に使用できます。しかし、問題はeval()の使用についてではなく、eval()で実行している文字列が悪意のあるパーティーによってどのように影響を受けるかを簡単に説明します。最後に、悪意のあるコードを実行します。力には大きな責任が伴います。だから賢く使ってください。これはeval()関数とあまり関係ありませんが、この記事にはかなり良い情報があります:http : //blogs.popart.com/2009/07/javascript-injection-attacks/ eval()の基本を探している場合こちらをご覧くださいhttps : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval


2

JavaScriptエンジンには、コンパイル段階で実行する多くのパフォーマンス最適化があります。これらの一部は、字句解析時にコードを本質的に静的に分析し、すべての変数と関数の宣言がどこにあるかを事前に判断できるため、実行中に識別子を解決するための労力が少なくて済みます。

ただし、エンジンがコード内でeval(..)を検出した場合、レキシリング時にeval(..)に渡すコードを正確に知ることができないため、エンジンは識別子の場所の認識がすべて無効であると想定する必要があります。字句スコープを変更するため、または参照する新しい字句スコープを作成するために渡すオブジェクトの内容。

言い換えると、悲観的な意味では、eval(..)が存在する場合、最適化のほとんどは無意味なので、最適化はまったく行われません。

これがすべてを説明しています。

参照 :

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#eval

https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch2.md#performance


100%保証されたコードでは、JavaScriptエンジンがコードを見つけて評価することはできません。したがって、いつでも準備ができている必要があります。
ジャックギフィン2018年

2

それは常に悪い考えではありません。たとえば、コード生成を見てみましょう。私は最近、virtual-domハンドルバー間のギャップを埋めるHyperbarsと呼ばれるライブラリを書きました。これは、ハンドルバーテンプレートを解析し、それを後でvirtual-domで使用されるハイパースクリプトに変換することで行われます。ハイパースクリプトは最初に文字列として生成され、それを返す前に、実行可能コードに変換します。私はこの特定の状況で悪の正反対を見つけました。eval()eval()

基本的に

<div>
    {{#each names}}
        <span>{{this}}</span>
    {{/each}}
</div>

これに

(function (state) {
    var Runtime = Hyperbars.Runtime;
    var context = state;
    return h('div', {}, [Runtime.each(context['names'], context, function (context, parent, options) {
        return [h('span', {}, [options['@index'], context])]
    })])
}.bind({}))

このeval()ような状況では、生成された文字列を一度解釈して、実行可能ファイルの出力を何度も再利用する必要があるため、のパフォーマンスは問題になりません。

ここで興味があれば、コード生成がどのように行われたかを確認できます。


2

eval()ブラウザで実行されるjavascriptで使用する場合、それは実際には問題にならないとまで言っておきます。*(警告)

最近のすべてのブラウザーには、とにかく任意のJavaScriptを実行できる開発者コンソールがあり、セミスマート開発者はJSソースを調べて、必要なあらゆるものを開発者コンソールに入れて、希望することを実行できます。

*サーバーエンドポイントにユーザーが入力した値の正しい検証とサニタイズがある限り、クライアント側のJavaScriptで何が解析され、評価されるかは問題ではありません。

eval()ただし、PHPでの使用に適しているかどうかを尋ねる場合、evalステートメントに渡される可能性のある値をホワイトリストに登録しない限り、答えはNOです。


開発コンソールがあるだけでなく、URLバーにjavascript:codeと入力して、古いIEブラウザーやモバイルデバイスの場合のように、ページがない場合にページ上に独自の開発コンソールを構築することもできます。
Dmitry

1

私はこれまでに述べたことに反論するつもりはありませんが、(私が知る限り)他の方法では実行できないeval()の使用を提供します。これをコード化する方法はおそらく他にもあり、最適化する方法もあるでしょうが、これは、他の方法がないevalの使用法をわかりやすくするために、わかりやすくするために長続きすることなく行われています。つまり、(値ではなく)動的に(またはより正確に)プログラムで作成されたオブジェクト名。

//Place this in a common/global JS lib:
var NS = function(namespace){
    var namespaceParts = String(namespace).split(".");
    var namespaceToTest = "";
    for(var i = 0; i < namespaceParts.length; i++){
        if(i === 0){
            namespaceToTest = namespaceParts[i];
        }
        else{
            namespaceToTest = namespaceToTest + "." + namespaceParts[i];
        }

        if(eval('typeof ' + namespaceToTest) === "undefined"){
            eval(namespaceToTest + ' = {}');
        }
    }
    return eval(namespace);
}


//Then, use this in your class definition libs:
NS('Root.Namespace').Class = function(settings){
  //Class constructor code here
}
//some generic method:
Root.Namespace.Class.prototype.Method = function(args){
    //Code goes here
    //this.MyOtherMethod("foo"));  // => "foo"
    return true;
}


//Then, in your applications, use this to instantiate an instance of your class:
var anInstanceOfClass = new Root.Namespace.Class(settings);

編集:ところで、私は(これまでに指摘されたすべてのセキュリティ上の理由から)オブジェクト名をユーザー入力に基づくことはお勧めしません。あなたがそれをしたいと思うであろう正当な理由を私は想像することはできません。それでも、それは良い考えではないことを指摘したいと思いました:)


3
これはで実行できます。namespaceToTest[namespaceParts[i]]ここではevalは必要ありません。そのためif(typeof namespaceToTest[namespaceParts[i]] === 'undefined') { namespaceToTest[namespaceParts[i]] = {};唯一の違いはelse namespaceToTest = namespaceToTest[namespaceParts[i]];
user2144406

1

ガベージコレクション

ブラウザのガベージコレクションは、evalされたコードをメモリから削除できるかどうかわからないため、ページがリロードされるまでコードを保存し続けます。ユーザーがページにすぐにいる場合でもそれほど悪くはありませんが、webappにとっては問題になる可能性があります。

これが問題をデモするスクリプトです

https://jsfiddle.net/CynderRnAsh/qux1osnw/

document.getElementById("evalLeak").onclick = (e) => {
  for(let x = 0; x < 100; x++) {
    eval(x.toString());
  }
};

上記のコードのように単純なものでは、アプリが終了するまで少量のメモリが保存されます。これは、評価されたスクリプトが巨大な関数であり、間隔で呼び出される場合はさらに悪化します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.