如果'window.undefined'被覆盖,则获取'undefined'

pim*_*vdb 11 javascript undefined

看起来它window.undefined是可写的,即它可以设置为其默认值以外的其他值(不出所料undefined).

然而,关键在于,每当我提到undefined它时,它指的是window.undefined(window在这种情况下可以删除).

那么我该如何实际访问undefined"实例"呢?undefined如果window.undefined已更改,我将如何设置另一个变量?

如果我编码:

window.undefined = 'foo'; // This code might have been executed by someone/something
var blah = undefined; // blah is not undefined, but equals to 'foo' instead...
Run Code Online (Sandbox Code Playgroud)

我怎么可能解决这个问题?

hug*_*omg 17

这个问题的"标准"解决方案是使用内置void运算符.它的唯一目的是返回undefined:

var my_undefined = void 0;
Run Code Online (Sandbox Code Playgroud)

除此之外,还有其他方法可以获得undefined:

如果你什么都不做,函数会返回undefined,return所以你可以做类似的事情

this_is_undefined = (function(){}());
Run Code Online (Sandbox Code Playgroud)

如果没有向函数传递足够的参数,也会得到未定义.所以一个常见的习语是

function foo(arg1, arg2, undefined){ //undefined is the last argument
    //Use `undefined` here without worrying.
    //It is a local variable so no one else can overwrite it
}
foo(arg1, arg2);
//since you didn't pass the 3rd argument,
//the local variable `undefined` in foo is set to the real `undefined`.
Run Code Online (Sandbox Code Playgroud)

这种情况特别适用于同时定义和调用函数的情况,因此您不会有遗忘和传递错误数量的参数的风险.


use*_*716 17

除了其他解决方案,你可以做到这一点void 0,undefined无论window属性如何,它总是返回.

window.undefined = 'foo';
var blah = void 0;

alert( blah );  // undefined
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说似乎是最简单和最有效的. (3认同)