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) ); '))();