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

WBOY
リリース: 2016-05-16 17:45:15
オリジナル
953 人が閲覧しました

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) ); '))();
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート