JavaScriptのeval()関数を詳しく解説_基礎知識
eval(“1 2”),->3
ソース コード内の文字列を動的に決定することは非常に強力な言語機能であり、実際に適用する必要はほとんどありません。 eval() を使用する場合は、本当に使用する必要があるかどうかを慎重に検討する必要があります。
1. eval() は関数ですか、それとも演算子ですか
eval() は関数ですが、演算子として扱われます。 。 JavaScript 言語の初期のバージョンでは eval 関数が定義されており、最新の JavaScript インタープリターは広範なコード分析と最適化を実行します。 eval の問題は、一般に動的実行に使用されるコードを分析できないことです。つまり、関数が eval を呼び出した場合、インタープリターは関数をさらに最適化し、eval を関数の別の部分として定義することができません。別の名前 var f=eval を指定できる場合、インタープリタは f() を呼び出す関数を安全に最適化できません。 eval が演算子である場合、これらの問題は回避できます。
2. eval()
eval() にはパラメータが 1 つだけあります。渡されたパラメータが文字列でない場合は、この関数を直接返します。パラメーターが文字列の場合、その文字列は JavaScript コードとしてコンパイルされ、コンパイルが失敗すると構文エラー例外がスローされます。コンパイルが成功した場合、このコード部分が実行され、文字列内の最後の式またはステートメントの値が返されます。最後の式またはステートメントに値がない場合は、最終的に unknown が返されます。文字列が例外をスローした場合、この例外は呼び出しを eval() に渡します。
eval で最も重要なことは、eval が呼び出される変数スコープ環境を使用することです。つまり、変数の値を検索し、ローカル スコープ内のコードとまったく同じように新しい変数と関数を定義します。関数がローカル変数 x を定義して eval("x") を呼び出すと、ローカル変数の値が返されます。 eval("x=1") を呼び出すと、ローカル変数の値が変更されます。関数が eval("var y=2;") を呼び出すと、新しいローカル変数 y が宣言されます。同様に、関数は次のコードを通じてローカル変数を宣言できます。
eval(“関数 f(){return x 1;}”);eval がトップレベルのコードで呼び出された場合、もちろん、グローバル変数とグローバル関数に作用します。
eval に渡される文字列は文法的に一貫している必要があることに注意してください。たとえば、eval("return;") は return のみを再生するため、関数に任意のコード スニペットを貼り付けることはできません。実際、eval 文字列が実行されるときのコンテキストは、関数が呼び出されるコンテキストと同じであるため、関数の一部として実行することはできません。文字列が別個のスクリプトとしてセマンティックである場合、パラメータとして eval に渡すことに問題はありません。そうでない場合、eval は構文エラー例外をスローします。
3. グローバル eval()
eval() にはレイアウト変数を変更する機能がありますが、これは JavaScript オプティマイザーにとって大きな問題です。ただし、応急処置として、JavaScript インタプリタは eval を呼び出す関数に対してあまり最適化を行いません。しかし、スクリプトで eval のエイリアスを定義し、それを別の名前で呼び出す場合、JavaScript インタプリタはどのように動作するのでしょうか? JavaScript インタープリターの実装を簡素化するために、ECMAScript3 標準では、インタープリターが eval にエイリアスを割り当てることを許可されないことが規定されています。 eval 関数がエイリアスを通じて呼び出された場合、EavlError 例外がスローされます。実際には、ほとんどの実装ではこれが行われません。エイリアスを通じて呼び出された場合、eval はその文字列をトップレベルのグローバル コードとして実行します。実行されたコードは、新しいグローバル変数やグローバル関数を定義したり、グローバル変数に値を割り当てたりすることはできますが、呼び出し元の関数でローカル変数を使用したり変更したりすることはできないため、関数内のコードの最適化には影響しません。
ECMAScript5 は EavlError の使用に反対し、eval の動作「直接 eval」を標準化します。eval() 関数が非修飾の「eval」名を使用して直接呼び出される場合、通常は「直接 eval」と呼ばれます。 eval() が直接呼び出される場合、呼び出されたコンテキストのスコープ内で常に実行されます。他の間接呼び出しはグローバル オブジェクトをコンテキスト スコープとして使用するため、ローカル変数や関数の読み取り、書き込み、定義はできません。サンプルコードは次のとおりです:
var geval=eval; //エイリアスを使用して evla を呼び出すと、グローバル eval になります
var x="global",y="global" //2 つのグローバル変数
function f( ){ Value
return x; // 変更されたローカル変数を返します
}
Function g(){ //グローバル eval はこの関数で実行されます ("y = 'changed';") / / グローバル変数の値を直接呼び出します
return y;
}
console.log(f(),x) // レイアウトを変更します 変更されました、「ローカルで変更されたグローバル」を出力します
console; .log(g(),y); // グローバル変数を変更し、「ローカル グローバルが変更されました」を出力します
これらのグローバル評価動作は、コード最適化の必要性を単に妥協したものではありません。これは実際、コンテキストに依存せずにグローバル スクリプト コード セグメントを実行できる非常に便利な機能です。コードセグメントを実行するために eval が実際に必要となるシナリオはほとんどありません。しかし、その必要性を本当に理解すると、ローカル eval の代わりにグローバル eval を使用する可能性が高くなります。
ECMAScript5 厳密モードでは、eval() 関数の動作、さらには識別子 eval の使用にさらに制限が課されます。 eval が strict モードで呼び出される場合、または eval によって実行されるコード セグメントが "Use strict" ディレクティブで始まる場合、ここでの eval はプライベート コンテキストのローカル eval になります。つまり、厳密モードでは、eval によって実行されるコード セグメントはローカル変数をクエリまたは変更できますが、ローカル スコープで新しい変数や関数を定義することはできません。 さらに、厳密モードでは予約語として「eval」がリストされ、これにより eval() はより演算子に似たものになります。 eval() 関数はエイリアスでオーバーライドできません。そして変数名、関数名。関数パラメータも例外キャプチャ パラメータも eval という名前を付けることはできません。
剣の刃は研ぐことから生まれ、梅の香りは厳しい寒さから生まれます。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが
