2017-04-20 44 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是不可配置的,不可寫屬性。即使在 情況並非如此,請避免重寫它。

該文檔說明它在所有現代瀏覽器中都是不可配置和不可寫入的,即使可能,您也應該避免更改它。