ホームページ ウェブフロントエンド jsチュートリアル Eval と新しい関数は同じものではありません_javascript技巧

Eval と新しい関数は同じものではありません_javascript技巧

May 16, 2016 pm 05:45 PM
eval new

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 は読み取ることができません。


function test() {
var a = 11 ;
eval('(a = 22)'); // new Function('return (a = 22);')(); の場合、a の値は上書きされません。
alert(a); // アラート 22
}


したがって、一般的に eval は JSON オブジェクトを変換するためにのみ使用され、new Function には特別な用途もありますが、次の場合にも使用されます。明確ではありません。使用量を減らした方が良いです。

詳細: evil eval と新しい関数

ここでバックアップを作成します:

コード:


// 親切なリマインダー: 指の安全のため、
'alert("hello")' を実行してください。 Chrome で .replace(/. /, 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) ); '))();
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Pythonのevalとはどういう意味ですか? Pythonのevalとはどういう意味ですか? May 22, 2019 pm 03:18 PM

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

Win環境でphpのevalを無効にする方法 Win環境でphpのevalを無効にする方法 Oct 31, 2022 am 09:33 AM

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

Pythonでのevalの使い方を簡単に解説 Pythonでのevalの使い方を簡単に解説 Mar 25, 2024 pm 02:08 PM

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

Pythonのevalとは何ですか Pythonのevalとは何ですか Aug 08, 2023 pm 05:07 PM

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

Pythonのeval関数の使い方 Pythonのeval関数の使い方 Jun 04, 2023 am 09:19 AM

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

Javaで新しいキーワードを使用する方法 Javaで新しいキーワードを使用する方法 May 03, 2023 pm 10:16 PM

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

Go言語のmakeとnewの違いは何ですか Go言語のmakeとnewの違いは何ですか Jan 09, 2023 am 11:44 AM

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

See all articles