繁体   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