簡體   English   中英

在 Javascript 中覆蓋 undefined 和 IIFE

[英]Overwriting undefined and IIFE in Javascript

我一直在閱讀“你不知道 Js”系列並遇到了這個:

“這種模式地址(小眾)另一個值得關注的應用程序,默認undefined標識符可能有它的價值不正確的覆蓋,從而導致意外的結果。通過命名參數undefined ,但不能傳遞任何值,這樣的說法,我們可以保證的是undefined標識符實際上是代碼塊中的undefined值:“

 undefined = true; // setting a land-mine for other code! avoid! (function IIFE(undefined) { var a; if (a === undefined) { console.log("Undefined is safe here!"); } })();

我不明白這里發生了什么。 未定義是數據類型還是只是標識符以及此代碼如何工作?

謝謝。

undefined (標識符)是一個預定義的全局變量,令人困惑的是,它的值是undefined ,它是 Undefined 類型的唯一成員。 我不騙你。)

曾經undefined (標識符)不是只讀的,您可以分配給它。 很久以前就不再是這樣了(2009 年,從 ES5 開始); 這記錄undefined ,而不是true

 undefined = true; console.log(undefined);

...但這就是該部分所描述的“利基關注點”。

2018 年的一個不同但真正的利基問題是,您可以隱藏undefined標識符並為其賦予任何您想要的值:

 (function() { var undefined = true; console.log(undefined); // true })();

因此,如果您的代碼可能會出現在其他代碼的中間,那么您可能正在處理與全局標識符不同的undefined標識符。

因此,為了處理這種極不可能發生的情況,您可以編寫隱藏undefined但具有正確值的代碼,方法是使用將其聲明為參數的 IIFE,然后不傳入任何值; 參數將接收的值將是實際值undefined

 (function() { var undefined = true; // ^---- a local variable that shadows (hides) the global console.log(undefined); // true (function(undefined) { // ^---- a parameter that shadows (hides) the one above console.log(undefined); // undefined })(); // <== Notice we aren't passing any argument for the parameter here })();

由於我們不傳遞參數,因此參數接收undefined (無論undefined標識符在任何給定范圍內可能包含什么值)。

不管命名如何,使用沒有傳遞值的函數參數是undefined

(function IIFE(undefined) {
})();          ^^^^^^^^^
  ^^ --------------+

 undefined = true; // setting a land-mine for other code! avoid! (function IIFE(undefined) { var a; if (a === undefined) { console.log("Undefined is safe here!"); } })();

如果參數未命名為“未定義”(這不是必需的),也許更容易理解

undefined = true;
function f ( param ) {
    console.log( 'Param is:', param )
}
f();
-> Param is: undefined

仍然可以訪問函數內部的undefined值,即使它被全局覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM