Eval と新しい関数は同じものではありません_javascript技巧
1. 関数宣言
function foo(){
//code
}
JS では関数もオブジェクトであり、関数オブジェクトは Function.prototype に接続されます (Function.prototype は Object.prototype に接続されます)
2. 関数リテラル 式
var foo = function foo(){
//code
}
オブジェクトにはプロトタイプ オブジェクトへの隠された接続があります。オブジェクトリテラルによって生成されたオブジェクトは、Object.prototype に接続されます。 foo.__proto__ == Function.prototype
3. New コンストラクターを使用して
new Function ([arg1[, arg2[, ... argN]],] functionBody); 🎜>実行されるたびに新しい関数を生成します
これら 3 つのモードを紹介するオンライン資料は数多くありますが、最初の 2 つは同じ語彙範囲に基づいており、ほぼ同じです。
字句スコープ: 変数のスコープは、実行時ではなく定義時に決定されます。つまり、字句スコープはソース コードに依存し、静的解析を通じて決定できます。字句スコープは静的スコープ ドメインとも呼ばれます。 withとevalを除けば、JSのスコープ機構は字句スコープ(Lexicalscope)に非常に近いとしか言えません。
突然、少し話が逸れたように感じます。この記事では、実際に eval と New Function の違いを記録します。本題に戻りましょう:
以前、new Function メソッドはほぼ同等であると言う人もいました。 eval. 今日調べてみたら、確かにこれを言った人は無責任だった。 eval と new function に関しては、得られる結果は同じであり、使用しないでくださいと言われます。結論としては、「必要に応じて」使用することです。
eval() は、現在の実行スコープ内で文字列を JavaScript 式として評価し、ローカル変数にアクセスできます。
new Function() は、文字列に格納されている JavaScript コードを関数オブジェクトに解析します。コードは別のスコープで実行されるため、ローカル変数にアクセスできません。
上記の 2 つの点から、新しい関数が動的に生成されるのに対し、eval のスコープは現在のスコープであることがわかります。常にそれらはすべてウィンドウです。さらに、eval はローカル変数を読み取ることができますが、new Function は読み取ることができません。
eval('(a = 22)'); // new Function('return (a = 22);')(); の場合、a の値は上書きされません。
alert(a); // アラート 22
}
したがって、一般的に eval は JSON オブジェクトを変換するためにのみ使用され、new Function には特別な用途もありますが、次の場合にも使用されます。明確ではありません。使用量を減らした方が良いです。
詳細: evil eval と新しい関数
ここでバックアップを作成します:
コード:
'alert("hello")'.replace(/. /, function(m){new Function(m)();}); 🎜> var i = 0; eval(new Array(101).join('alert(i);'));
var i = 0; new Array(101).join('alert(i) ); '))();

ホット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)

ホットトピック









eval は「評価」を意味し、文字列式を実行してその式の計算結果を返すために使用される Python の組み込み関数です。つまり、変数を代入する場合、等号の右側の表現は次のようになります。文字列形式で記述され、戻り値はこの式の結果です。構文「eval(expression[, globals[, locals]])」。

Win 環境で PHP の eval を無効にする方法: 1. 「PHP_diseval_extension」をダウンロードします; 2. サーバーが現在使用している PHP を見つけます; 3. PHP 構成ファイルを開きます; 4. 「extension=diseval.so」コードを追加します; 5.サービスを再起動します。

Python では、eval() 関数を使用して文字列式を実行し、その結果を返します。式を含む文字列をパラメータとして受け取り、その式を評価します。 eval() 関数は強力ですが、文字列に含まれる有効な Python 式を実行することに注意してください。そのため、セキュリティの脆弱性を防ぐために、この関数を使用する場合は外部入力文字列を受け入れないようにする必要があります。

eval は、文字列をコードとして解析して実行し、実行結果を返すために使用される Python の組み込み関数です。 「eval」関数は任意のPythonコードを実行できるため、「eval」関数を使用する場合はセキュリティ上の問題を十分に考慮する必要があります。「eval」関数に信頼できない文字列を渡すと、コードインジェクションなどのセキュリティ上の問題が発生する可能性があります。 。

Python の eval() 組み込みの Pythoneval()[1] を使用して、文字列ベースまたはコンパイルされたコードベースの入力から式を動的に評価できます。文字列を eval() に渡すと、関数はそれを解析し、bytecode[2] にコンパイルし、Python 式として評価します。ただし、コンパイルされたコード オブジェクトで eval() を呼び出すと、関数は計算ステップのみを実行します。これは、同じ入力で eval() を複数回呼び出す場合に非常に便利です。 Pythonのeval()は次のように定義されています。 eval(expression[,globals[,locals]]) この関数

1. 概念 Java 言語では、「new」式はインスタンスを作成する役割を果たし、その中でコンストラクターが呼び出されてインスタンスを初期化します。コンストラクター自体の戻り値の型は void であり、「コンストラクターは新しく作成された値を返す」ではありません。オブジェクト参照」ですが、新しい式の値は新しく作成されたオブジェクトへの参照です。 2. 目的: 新しいクラスのオブジェクトを作成する 3. 動作メカニズム: オブジェクトのメンバーにメモリ領域を割り当て、デフォルト値を指定する メンバー変数を明示的に初期化し、構築メソッドの計算を実行し、参照値を返す 4. 新しい操作を頻繁にインスタンス化するメモリ内に新しいメモリを開くことを意味し、メモリ内のヒープ領域にメモリ空間が確保され、jvmによって制御され、メモリが自動的に管理されます。ここでは例として String クラスを使用します。プ

相違点: 1. Make は、slice、map、および chan タイプのデータの割り当てと初期化にのみ使用できますが、new は任意のタイプのデータを割り当てることができます。 2. 新しい割り当ては型「*Type」であるポインタを返しますが、make は参照である Type を返します。 3. new によって割り当てられたスペースはクリアされ、make によってスペースが割り当てられた後、初期化されます。
