<script type="text/javascript">
var a;
(function (){
if(a){
alert(a)
}else{
alert("728");
}
})()
(function (){
if(!a){
alert(a)
}else{
alert("728");
}
})()
//上面代码应该alert()两次,可为什么只有第一个alert()蹦出了个728,本应该再弹出第二个undefined,但如果我把第一个匿名函数删除的话就会弹出undefined,这是怎么回事?
</script>

解决方案 »

  1.   


    <script type="text/javascript"> 
    var a; 
    (function (){ 
    if(a){ 
    alert(a) 
    }else{ 
    alert("728"); 

    })(); // 加个结束符看看
    (function (){ 
    if(!a){ 
    alert(a) 
    }else{ 
    alert("728"); 

    })(); 
     
    </script>
      

  2.   

    经测试本代码无误.运行正常<script>
    var a;
    (function (){
        if(a){
            alert(a);
        }
        else{
            alert("728");
        }
    })();    //你的代码里少了分号,没有结束,会报错(function (){
        if(!a){
            alert(a);
        }
        else{
            alert("728");
        }
    })()
    </script>
      

  3.   

    if(!a){ 
    alert(a) 
    }错误在这里.!a 需要复值判断.因为你没有值 所以没有定义.你可以给A = 1 你再测试就明白了
      

  4.   

    JS可以省略句尾的分号
    但是LZ这个是个特殊情况,混淆了出现这种情况,跟JS是如何解释执行有关
    JS中有一些语句是可以分行写的,分号;是强制性将语句终结
    比如:
    var a = 1;
    等价于
    var a
    =1;var str = "aaa"+"bbb";
    等价于
    var str = "aaa"
    +"bbb";JS的语句是否结束不是看是否到行尾,跟下一行的内容也有关
    下行的内容除了上面2中情况以外,也包括其他众多情况,JS认为语句未结束
    其中就包括小括号(),即LZ遇到的情况
    var str = "aaa"
    var str1 = "bbb"
    不会报错但是如果
    var str = "aaa"
    (function (){
        alert(str);
    })()
    这就会报错
    所以,写JS代码的时候还是规范书写比较好
    语句结束就加分号强制结束
      

  5.   

    差不多是你这个意思,因为你可以(function(){})() 这样执行,当然就也可以( (function(){})(){} ) () 这样执行,所以如果你不加分号结尾,那浏览器解释就是相当于函数参数继续执行,用闭包要小心咯
      

  6.   

    (function (){ 
         if(a){ 
         alert(a) 
    }else{ 
            alert("728"); 
         } 
    })() 
    (function (){ 
        if(!a){ 
        alert(a) 
    }else{ 
            alert("728"); 
         } 
    })
    ()
    楼上朋友,我意思是红字这个括号里的内容是被当做上面执行函数的参数了,这样感觉好像也说不过去哦!
    因为上面那匿名函数里面也没有return返回个函数呀?真不知道该怎么去理解?
      

  7.   

    解释器的原因,遇到()()  {}() 的话继续解释执行,而不是说移动要{return}() 才执行