2015-12-04 14 views
6

私は奇妙な方法でeval関数をコンストラクタとして使用しています。JavaScript関数のコンストラクタもすべてではありませんか?

try { 
    var y = new eval() 
} catch(error) { 
    console.log("caught a " + error.name + ": " + error.message); 
} 

それとしてエラーをスローし、エラーメッセージが示すように

caught a TypeError: function eval() { [native code] } is not a constructor 

は、評価関数ではなく、コンストラクタです。

質問は、すべてのjavascript関数がコンストラクタとしても機能するわけではありませんか?

+0

evalは予約されたキーワード/ネイティブ関数です。それで混乱しないでください。 –

+2

いいえ、いくつかの他の注目すべき例外はいくつかの_DOM_メソッドと_arrow関数です。 'x => undefined' –

+0

合意した、evalは組み込み関数です。独自の 'function myEval(){}'を作成し、そのコードを使用した場合、それは問題ありません。 –

答えて

6

すべての機能がコンストラクタであるとは限りません。

コンストラクタはすべてfunction values with a [[Construct]] internal propertyです。すべての機能にはありません。これは言語仕様の6.1.7.2 Object Internal Methods and Internal Slotsに明示されている:

関数オブジェクトは、必ずしもオブジェクトが[[構築]]内部メソッドを持たないコンストラクタと、非コンストラクタ関数ではありません。コンストラクタがTypeErrorを投げるなどの非コンストラクタを呼び出すためにnewまたはReflect.constructを使用して

+0

これには実際にどのような意味がありますか? JavaScript関数を記述すると、自動的にこの[[Construct]]内部メソッドでタグ付けされますか? –

+0

@ JohnCarpenter、関数の作成方法によって異なります。 @PaulSが指摘しているように、矢印関数の構文を使って関数を作成すると、[[Construct]]プロパティがないことを意味します。 'function'キーワードを使うと、一般に構築可能な関数が生成されます。 –

+0

ええ、私が知らなかったことを知らなかったもののリストにこれを加えてください。 –

関連する問題