[英]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.