2012-08-08 132 views
9

我想创建一个可重用的函数,检查变量是否未定义。奇怪的是,当我将变量传递给函数来执行代码时,它不起作用,但如果我在函数之外使用相同的逻辑,它就会起作用。有什么办法让这个函数isDefined工作吗?将未定义的变量传递给函数时出错?

//THIS WORKS AND RETURN FALSE 
alert(typeof sdfsdfsdfsdf !== 'undefined'); 

//THIS GIVES AN ERROR, WHY? 
//Uncaught ReferenceError: sdfsd is not defined 
function isDefined(value) { 
     alert(typeof value !== 'undefined' && value !== null) 
} 

isDefined(sdfsd); 

这里活生生的例子(检查错误控制台):http://jsfiddle.net/JzJHc/

+0

你不能这样做。如果它不存在,如何将它放入函数中进行测试?此外:'typeof value!=='undefined'&& value!== null'是非常不必要的。如果你想要一个'null'或'undefined'测试,只需要'value == null'。它完成了同样的事情。 – 2012-08-09 00:08:31

回答

10

当您尝试通过您不能使用尚未声明的变量,除非它是在一个typeof测试

一个未被声明为函数的变量,被认为使用了未声明的变量。你会发现该错误是在调用者,而不是内部isDefined

你需要给它传递到函数之前运行检查

if (typeof sdsdsd !== 'undefined') 

。基本上,这意味着你不能写一个isDefined函数接受未声明的变量。你的功能只能用于未定义的属性(这是可以传递的)

但是,我很好奇,什么是真实世界的情况下,你传递一个不存在的变量?你应该声明所有的变量,它们应该已经存在。如果您声明var sdsdsds它将存在与undefined的值和您的isDefined函数将工作得很好。

+0

+1 *特别是*为最后一段。 – 2012-08-09 00:10:53

+0

事实上,你最后的一段让我想到更优雅地重构建筑。我的场景是一个变量正在通过MVC视图呈现。但如果请求没有结果,则视图有条件不呈现它。所以我初始化Javascript(从另一个视图),检查该对象是否存在或不执行操作。所以你是对的,我应该在MVC条件之外声明变量。感谢您的建议! – TruMan1 2012-08-11 13:43:04

+0

您可以使用未声明的变量的另一种情况是* delete *。 – zsong 2014-06-12 19:49:28