2012-03-28 51 views
0

我有一个使用全局变量像许多JS方法:如何有效地检查是否变量已宣布

function DoSomething() { 
    var val=$('#'+clientId).val(); 
    . 
    . 
    . 
} 

DoSomething的使用的clientId变数。问题在于clientId并不总是被声明的,因此我得到了未声明的变量的异常。
我有很多这样的地方,并添加if (typeof clientId == "undefined")检查无处不在是很多工作和代码重复(重复检查)。有我可以解决它吗?例如,如果变量未被声明,则使用返回null的方法? (在这种情况下,我可以控制返回值,例如在未定义的情况下)

+1

您可以创建这样的方法,实现'如果( typeof variable ==='undefined')'。在我看来这是一个很好的解决方案。 – iMoses 2012-03-28 14:56:17

回答

0

只是一个想法:所有变量都是名称空间的属性,直到全局名称空间(在浏览器中,即window)。未分配的房产评估为undefined。所以如果你想知道是否分配了一个变量,你可以使用if (property in namespace)。如果它涉及浏览器中的全局变量:if (clientId in window)。现在你可以做出一个功能:

function exists(label, namespace){ 
    namespace = namespace || window; 
    return namespace[label] || false; 
} 
// possible usage 
function DoSomething() { 
var val=$('#'+(exists('clientId')||0)).val(); 
// ... 
} 
0

全局变量是邪恶的,如果可能的话,要避免。

在你给的例子,这将是更好的申报客户端ID作为一个参数,像这样:

function DoSomething(clientId) { 
    var val=$('#' + clientId).val(); 
    . 
    . 
    . 
} 

这样,你不会受到全局变量问题,有没有副作用效果(由其他方法引起的价值变化)担心。

祝你好运!

+0

我喜欢那些只是伸出援手来帮助别人的人,然后砰的一声。你可以在没有恶意评论的情况下添加链接,这样会更好。我不是鹦鹉,顺便说一句,我有29年的编程经验,并且知道绳索,谢谢。祝你今天愉快。 – 2012-03-28 19:04:45

1

在我看来,如果您的代码路径试图在定义之前使用全局变量,那么您的代码就会被破坏。要么你需要给它一个默认值,你需要重新排序代码的加载或执行,或者当你的环境没有被初始化时,你需要阻止代码运行。

它可以初始化变量当且仅当它尚未定义是这样的:

var clientId = clientId || "foo"; 

你可以把这个在使用它的任何模块的顶部。这会初始化它,只要它没有被初始化就可以。

你也可以建立你自己,你会改用直接访问这样的变量的访问功能:

// put this somewhere early in the JS loading process 
function getClientId() { 
    if (typeof window.clientId !== "undefined") { 
     return(window.clientId); 
    } else { 
     return("foo"); // whatever default value you want to return here 
    } 
} 

// use it like this: 
function DoSomething() { 
    var val=$('#'+getClientId()).val(); 
    . 
    . 
    . 
} 

或者,你可以做一个全球性的功能,将测试:

function isClientId() { 
    return(typeof window.clientId !== "undefined"); 
} 


// use it like this: 
function DoSomething() { 
    if (isClientId()) { 
     var val=$('#'+clientId).val(); 
     . 
     . 
     . 
    } 
} 
+0

var clientId = clientId ||中的问题“富”;当clientId被定义时,它变成了未定义的。 – Naor 2012-04-01 10:22:37

+0

@Naor - 那是不正确的。 'var clientId = clientId || “foo”;'不能使'clientId'未定义。只有当'clientId'是一个像undefined','null','0','false'这样的falsey值时,它才会将'foo''分配给clientId。它不会也不能使它成为'undefined' 。如果您看到了这一点,那么您的代码中还有其他事情需要您向我们展示。 – jfriend00 2012-04-01 10:32:29

+0

Here:http://jsfiddle.net/eVxmX/ – Naor 2012-04-01 11:16:32

0

尝试:

var isExists =clientId || false; 

,但要小心

if ClientId==0它会告诉你假。

0

我用:

if (typeof (foo) != 'undefined') 
    alert ('foo is defined'); 
+0

我认为这是最简单的方法来做到这一点......但我同意beardtwizzle。我经常使用“相同类型”相同的“===”,如:if(foo === true)或if(foo ==='text') – Redtopia 2012-03-28 14:58:32

0

如果变量本身声明(而不是仅仅有一个未定义的值),那么你可以简单地使用(clientId || 'default value')。这要求你在全球范围内有var clientId;或类似的东西(这是不好的做法,BTW)。

如果您没有保证clientId已被声明在某处,那么使用上述构造仍然会抛出未定义的变量错误。在这种情况下,你可以使用这个:(typeof clientId == 'undefined' ? 'default value' : clientId)

0

虽然我喜欢答案,我去简单的方法...只是声明var clientId;在你的脚本之上。如果你不把它传递那么任何值:

var clientId; 
if(!clientId){ 
    //will reach here cause declared but with no value 
} 

var clientId; 
clientId = 132; 
if(!clientId){ 

}else{ 
     //will reach here cause it has a value 
} 

所以

function DoSomething() { 
     if(clientId){ 

会工作

相关问题