2017-04-20 4 views
2

このコードをchromeでテストしました56javascriptで関数内でNaNを上書きできるのはなぜですか?

この奇妙なコードが見つかりました。

私はコンソールにconst NaN = '';

をこのコードを入力する場合、私は私が期待されるこのメッセージが表示されました。 Uncaught SyntaxError: Identifier 'NaN' has already been declared at <anonymous>:1:1

しかし、私は関数内のNaNキーワードを上書きしている場合はjavascriptのキーワードは、関数でオーバーライドすることができましょう、なぜ、この

function a(){ const NaN = ''; return NaN; }

のように、それは空の文字列に''

を返しますか?

+3

?'NaN'が既にグローバルスコープで定義されている場合、グローバル定義はそれをシャドウすることはできませんが、ローカル定義はクロージャを作成し、同じ名前の新しい識別子のための"スペース "を作成します。 –

+4

NaNはグローバルプロパティであり、キーワードではありません。 –

+7

'var a = 1;を実行できないのと同じ理由があります。 const a = 2; 'しかし、あなたは' var a = 1;関数b(){const a = 2; } '。 'const'変数を再定義することはできません。関数の中では、それは異なる変数になります。 – JJJ

答えて

1

のNaN、すなわち、それがグローバルスコープの変数であり、グローバルオブジェクトのプロパティです。

これは書き換えできません。他の値を割り当てることはできません。

実際には可能ですが、グローバルスコープではありません。関数内でそれを行う場合は、その値を上書きしてアクセスすることができますが、のみが関数スコープ内にあります。関数内のNaNプロパティに値を再割り当てしたとしても、グローバルオブジェクトに影響しません。同じことが、例えば、特許文献2に関連する。 Infinity

constキーワードでmisleadedてはいけない、letまたはvarを持つかどうか、それは可能ではないのですが、何が言及worths - varを使用すると、すべてのエラーをスローしませんが、グローバルオブジェクトがまだかかわらず、上書きされることはありません。おそらくので、スコープの

(function() { 
 
    const NaN = 'something'; 
 
    const Infinity = '5'; 
 
    console.log(NaN); 
 
    console.log(Infinity); 
 
})(); 
 

 
console.log(NaN); //hasn't been overwrited 
 
console.log(Infinity); //hasn't been overwrited 
 

 
//const NaN = ''; --> throws error (has already been declared) 
 
//const Infinity = 5; --> throws error (has already been declared)

1

From MDN Documentation

NaNはグローバルオブジェクトのプロパティです。 NaNの初期値は Not-A-Number - Number.NaNの値と同じです。最新の ブラウザでは、NaNは設定不可能で書き込み不可能なプロパティです。 がそうでない場合でも、オーバーライドしないでください。

ドキュメンテーションは、すべての最新のブラウザでは設定ができず、書き込みもできないことを示しています。可能であれば、変更しないでください。 MDNドキュメントによれば

関連する問題