如果覆盖了'window.undefined',则会得到'undefined'。

11

看起来 window.undefined 是可写的,即它可以被设置为除其默认值以外的其他值(默认值是 undefined,这并不奇怪)。

然而问题在于,每当我引用 undefined 时,它都指的是 window.undefined(因为在这种情况下可以删除 window)。

那么,我应该如何实际访问"未定义"的"实例"呢?如果 window.undefined 已经被更改,我将如何能够将另一个变量设置为 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...

我怎样才能解决这个问题?


1
修复覆盖“undefined”的代码? - John Kugelman
我的猜测是在更改之前将其存储。 var undef = window.undefined; window.undefined ='foo'; car myvar = undef; - Brad Christie
他的观点是“这段代码可能已被某人/某物执行”。那么,从哪里获取“undefined”值呢? - Martin Hennings
你是在实际应用中遇到这个问题还是只是在理论/测试中?虽然window.undefined是可写的,但显然向其写入内容是一个非常糟糕的想法。是否有一些库会向其中写入内容呢? - Samuel Neff
1
也许值得指出的是,现代浏览器完全支持ECMA 5,不再允许您覆盖保留关键字,例如undefined,因此这种情况不可能发生。 - Pawel Sledzikowski
显示剩余2条评论
4个回答

19

解决这个问题的“标准”方法是使用内置的void运算符。它的唯一目的是返回未定义:

var my_undefined = void 0;

除此之外,还有其他方式可以获得undefined
如果您没有返回任何内容,函数将返回undefined,因此您可以执行以下操作:
this_is_undefined = (function(){}());

如果您没有向函数传递足够的参数,那么您将得到未定义的结果。因此,一种常见的习惯用法是:
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`.

这种方法特别适用于定义和调用函数同时进行的情况,因此您没有忘记并传递错误数量参数的风险。


17

除了其他的解决方案,您还可以使用 void 0 技巧,它始终返回 undefined,无论 window 属性如何。

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

alert( blah );  // undefined

3
这对我来说似乎是最简单和最有效的。 - Tim Down

3

实际上,与undefined进行比较并不是一个好主意。应该使用typeof运算符代替:

function isUndefined ( variant ) { return typeof variant === 'undefined' }

3

只声明变量而不将其赋值应该是足够的:

var local_undefined;
alert(typeof local_undefined);

但是为什么可以更改未定义的值? 有人知道背后的历史吗?


它确实可以这样工作,但需要使用local_undefined代替(http://jsfiddle.net/vMJYd/)。而且这个问题似乎在JavaScript 1.8.5中得到了修复(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined)。 - pimvdb
1
请点击此处查看正确的链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined - jontro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接