2017-04-20 45 views
2

我测试了这个代码在铬56为什么javascript让NaN在功能上被覆盖?

我刚刚发现这个奇怪的代码。

如果我输入控制台const NaN = '';

这个代码,我得到这个消息,我的预期。 Uncaught SyntaxError: Identifier 'NaN' has already been declared at <anonymous>:1:1

,但是,如果我重写功能NaN的关键字,这样

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

返回空字符串''

为什么要使用JavaScript让关键字可以在功能overrided?

+3

可能因为范围界定的?如果已经在全局范围内定义了'NaN',那么你的全局定义不能对它进行遮蔽,但是一个局部定义会创建一个闭包,从而为一个具有相同名称的新标识创建一个“空间”。 –

+4

NaN是全球性的财产,而不是关键字。 –

+7

你为什么不能'var a = 1; const a = 2;'但你可以做'var a = 1;函数b(){const a = 2; }'。你不能重新定义一个'const'变量。在函数内部,它变成了一个不同的变量。 – JJJ

回答

1

根据该MDN文档:

的NaN是全局对象的属性,即,它是在全局范围内的变量。

它不可重写,您不能指定任何其他值。

注意它实际上是可能的,但不是在全球范围内。如果你想在一个函数内部完成它,那么你可以覆盖它的值并访问它,但在功能范围内只有只有。即使您已将值重新分配给函数内的NaN属性,全局对象也不会受到的影响。

同样涉及例如, Infinity

不要与const关键字的误导,这是不可能是否符合letvar,但什么一点,实在值得一提的 - 使用var不会引发任何错误,但全球对象仍然不会尽管overwrited。

(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的初始值是 非数字 - 与Number.NaN的值相同。在现代的 浏览器中,NaN是不可配置的,不可写属性。即使在 情况并非如此,请避免重写它。

该文档说明它在所有现代浏览器中都是不可配置和不可写入的,即使可能,您也应该避免更改它。