如果变量已声明,如何有效地检查

时间:2012-03-28 14:50:00

标签: javascript jquery

我有很多使用全局变量的js方法,如:

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

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

7 个答案:

答案 0 :(得分: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();
        .
        .
        .
    }
}

答案 1 :(得分:0)

全球变量是邪恶的,如果可能的话应该避免。

在您给出的示例中,将客户端ID声明为参数会更好,如下所示:

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

这样,您不会受到全局变量问题的影响,也不会担心副作用(由其他方法引起的值更改)。

祝你好运!

答案 2 :(得分:0)

尝试:

var isExists =clientId || false;

但要小心

如果ClientId==0它会显示为false。

答案 3 :(得分:0)

我用:

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

答案 4 :(得分:0)

如果声明了变量本身(而不是仅具有未定义的值),那么您只需使用( clientId || 'default value' )即可。这要求您在全局范围内有var clientId;或类似的东西(这是一种不好的做法,BTW)。

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

答案 5 :(得分: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();
 // ...
}

答案 6 :(得分: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){

可行吗