前の言葉
その存在が間違いであるかのように、評価とwithはしばしば嫌われています。 CSSでは、テーブルは嫌いで、レイアウトではなくWebページにデータを表示するためにテーブルのみを使用して、不規則で過剰に拒否される場合があります。では、評価ととの状況はどうですか?この記事では、eval()関数を紹介し、ステートメントを詳細に紹介します
評価します
意味
eval()はグローバル関数です。 JavaScriptはeval()を使用して、JavaScriptソースコードで構成される実行中の文字列を説明します。
var result = eval( '3+2'); console.log(result、typeof result); // 5 'number'
使用法
eval()には1つのパラメーターのみがあります。渡されたパラメーターが文字列ではない場合、このパラメーターを直接返します。パラメーターが文字列の場合、文字列をJavaScriptコードとしてコンパイルします。コンパイルが失敗した場合、構文エラー(SynTaxError)例外がスローされます。コンパイルが成功した場合、コードが実行され、文字列内の最後の式またはステートメントの値が返され、最後の式またはステートメントに値がない場合、最終的には未定義になります。文字列が例外をスローする場合、例外はeval()への呼び出しを渡します
var num = 1; var str = 'test'; console.log(eval(num)); // 1console.log(eval(str)); // referenceError:テストはvar strlong1 = 'var x = 1; var y = 2;'; console.log(eval(strlong1)、x、y); // x ++; '; console.log(eval(strlong2)、x); // 1 2
範囲
eval()は、それを呼び出す可変スコープ環境を使用します。つまり、変数の値を探し、ローカル範囲の新しい変数と関数とコードの動作を定義します。
var b = 2; function foo(str、a){eval(str); console.log(a、b);} foo( 'var b = 3;'、1); // 1 3エイリアス
エイリアスを介して呼び出されると、eval()はその文字列をトップレベルのグローバルコードとして実行します。実行されたコードは、新しいグローバル変数とグローバル関数を定義したり、グローバル変数に値を割り当てることもできますが、関数内のローカル変数を使用または変更することはできません。
var geval = eval; var x = 'global'、y = 'global'; function f(){var x = 'local'; eval( 'x += "changed";'); return x;} function g(){var y = 'local'; geval( 'y += "changed";'); return y;} console.log(f()、x); // localchanged globalconsole.log(g()、y); //[注] IE8-ブラウザはエイリアスを介してeval()を呼び出し、通常は同じ結果をeval()を呼び出します。
副作用
JavaScriptインタープリターは、多くのコード分析と最適化を実行します。 eval()の問題は、動的実行に使用されるコードが通常分析されないため、インタープリターが最適化できないため、パフォーマンスの劣化につながることです。
eval()と同様に、settimeout()、setInterval()、new function()などです。これらの関数は、パラメーターとして文字列を使用してプログラムを実行するときに動的に実行できます。この実行メカニズムの利点は、パフォーマンスの損失を相殺することはできないため、使用を避けるようにしてください。
厳密なモード
eval()関数は強すぎるため、厳密なモードは厳密に制限されます
【1】変数または関数はeval()関数を介して作成することはできませんが、それらの値は照会および変更できます
'Strict'を使用; eval( 'var x = 1;'); console.log(x); // referenceError:xは定義されていません 'use strict'; var x = 1; eval( 'x = 2;'); console.log(x); // 2
【2】識別子としてEvalを使用できません
「Strictを使用」; var eval = 10; // syntaxerror:厳密なモードでの予期しない評価または引数
と
ステートメントで定義する目的は、同じオブジェクトを複数回作成する作業を簡素化することです。
withステートメントは、スコープチェーンのヘッドにオブジェクトを追加し、ステートメントを実行し、最後にスコープチェーンを元の状態に復元します。
with(object){ステートメント;}効果
オブジェクトのネストレベルが深い場合、通常、ステートメントはコードライティングを簡素化するために使用されます。本質的に、オブジェクトの参照をスコープとして扱い、オブジェクトの属性をスコープ内の識別子として使用することで処理され、したがって新しい語彙スコープを作成する
クライアントJavaScriptでは、次のような式を使用して、HTMLフォームの要素にアクセスするために使用できます
document.forms [0] .address.value
そのような式がコードに複数回表示される場合、withステートメントを使用してフォームオブジェクトをスコープチェーンの最上位レベルに追加できます
with(document.forms [0]){name.value = ''; address.value = ''; emai.value = '';}このメソッドは、各プロパティ名のdocument.forms [0]を接頭することなく、多くの入力を減らします。このオブジェクトは、スコープチェーンに一時的に取り付けられています。 JavaScriptがアドレスなどの識別子を解析する必要がある場合、このオブジェクトで自動的に検索します。
[注] withステートメントは、オブジェクトのプロパティを読み取るためのショートカットを提供しますが、オブジェクトのプロパティを作成することはできません
オブジェクトOに属性xがある場合、次のコードは属性値を1に割り当てます
var o = {x:0}; with(o)x = 1; console.log(ox); // 1oで属性xが定義されていない場合、次のコードは、withステートメントを使用しないコードx = 1とまったく同じです。これは、LHSクエリが変数xで実行され、1がそれに割り当てられているためです
var o = {};副作用
evalと同様に、withステートメントのJavaScriptコードを最適化することは非常に困難であり、コードのデバッグも困難を引き起こします。 withステートメントを使用しないコードよりも遅いです。
さらに、withステートメントが不適切である場合、漏れが変動し、グローバルな範囲を汚染する可能性があります。
var x = 1; var o = {}; with(o){x = 2;} console.log(x); // 2console.log(ox); // undefined厳密なモード
厳密なモードでは、ステートメントでの使用は禁止されています
// syntaxerror:strictモードコードは、statement 'use strict'; var o = {}; with(o){x = 2;}を含むことはできません。やっと
Evalを使用して、エンジンがコンパイル時間のスコープルックアップを最適化することを不可能にするため、パフォーマンスの劣化とコードの実行が遅くなります。実際の作業では評価がめったに使用されないため、厳密なモードでの制限は私たちにほとんど影響しません。外務省がある日、私たちの国がジャマイカにビザを発行しなくなるという発表を発表したように。私たちはジャマイカのことを聞いたことがありますが、ほとんどの人は人生で一度そこに行かないかもしれないので、それは問題ではありません。同様に、評価が嫌いかどうかは関係ありません
上記は、編集者があなたに紹介したJavaScript学習の要約の詳細な説明であり、評価機能とステートメントの例があります。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!