菜鸟看到一段代码,学到两个知识点,发出来和大家玩一下,呵呵
问题:
(1)alert弹出什么内容?
(2)为什么?
if(("a" in window)){
    var a = 1;
}
alert(a);

解决方案 »

  1.   

    "a" in window返回false,不执行var a = 1;
      

  2.   

    弹出1,"a"是一个字符串,应该in window,var a=1,a已经定义并赋值了,所以弹出1
      

  3.   

    "a" 这个"a" 应该是全局变量才对吧function foo() {
       var a = b = 0;
    }
    比如这个 b就是一个隐藏的全局变量
    window 里面应该有个a吧,不知道说的对不对
      

  4.   

    很明显是undefined  window是DOM元素 "a"是字符串 所以不存在in的关系 所以表达式返回false,var a=1不执行所以 a没有定义 弹出的就是undefined
      

  5.   

    我再来解释下吧输出1原因全局字符串都是window的属性
    故"a" in window返回true故执行 var a = 1;
      

  6.   

    用N个浏览器试了下...都弹出"1",var a是全局的似乎
      

  7.   

    同样是作用域问题吧,JS会对同一个作用域的变量和函数进行预编译。。以上代码if(("a" in window)){
        var a = 1;
    }
    alert(a);等价于var a;//预编译的过程,同一作用域内的变量与函数会首先被定义
    if(("a" in window)){//所以这里的a自然是window的一个属性了 ,为true
        a = 1;
    }
      

  8.   

    http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html刚看见汤姆大叔的博客,瞬间就明白了预解析:var散布的问题(Hoisting: A Problem with Scattered vars)
    JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。当你使用了一个变量,然后不久在函数中又重新声明的话,就可能产生逻辑错误。对于JavaScript,只 要你的变量是在同一个作用域中(同一函数),它都被当做是声明的,即使是它在var声明前使用的时候。
      

  9.   


    ++,其实在jQuery中我们使用的$,jQuery这些都是利用了这一点,重写/增加了window中的对象/属性
      

  10.   

    楼主的代码等同于如下var a;
    if("a" in window) {
        a =1;
    }
    alert(a);这样看就明白了,其实就是一个声明前置的问题,所以肯定输出1
      

  11.   

    哦,通过这个代码学到一个知识点的话也不行?
    再说,我也没说这个是现实中的代码啊,没看到我写的玩玩吗?
    这种代码我现实中不会用,但是通过这种代码我学到了一点js的原理,难道不可以?
    ps:不懂的人,楼上已经有正确答案,自己先看看哪个像先
      

  12.   

    给我的感觉就像是赋值而并非if的判断
    把a字符串赋给window..永远是true
      

  13.   

    alert("a" in window);//这是true 预编译了
    var a;
      

  14.   

    这样弹出的是什么? 虽然一看写法就知道差别和原因,但有时候也会在这块犯错
    if((window['a'])){
        var a = 1;
    }
    alert(a);
      

  15.   

    if(("a" in window)){,
    这句话无形中已经定义了一个a的变量了,所以在window里肯定会存在哦
      

  16.   

    那你改成if(("b" in window))试试?
      

  17.   

    晕~~  不才使用别人的代码里刚好用到了 in   我当时还在想这in是什么意思,  求解一下楼主, in是怎么意思 for(var i in c){
    if(c[i]==delOn){
    delete c[i];
    }
    }
      

  18.   

    遍历一个对象的属性。如果这个对象的属性的值等于delOn,就把那个属性删除。你把i弹一下就知道i是什么了
      

  19.   

    我试了一下,弹出的是1,我认为,楼上有位伙计说的就很对,只要是全局变量都是window对象下面的属性!
    所以,‘a’ in window会返回true,所以a被赋值为1,弹出窗口为1
      

  20.   

    if(("a" in window)){
        var a = 1;
    }
    alert(a); //1将其改编一下
    (1)
    alert(a); //undefined
    if(("a" in window)){
        var a = 1;
    }
    alert(a); //1(2)
    alert(a); //直接报错,因为没有声明a
    if(("a" in window)){
        a = 1;
    }
    alert(a); //1证明:
    var a;
    alert(a); //直接报错,因为没有声明a
    if(("a" in window)){
        a = 1;
    }
    alert(a); //1
      

  21.   

    <html>
    <head>
    <script type="text/javascript">
    function open_win(){
    if(("a" in window)){
    alert("windows");
    }
    else{
    alert("null");
    }
    }
    </script>
    </head><body>
    <form>
    <input type="button" value="swd" onclick="open_win()">
    </form>
    </body></html>
    结果是null,而不是windows
      

  22.   


    跟声明前置有毛关系,你看这样写有用么
    <script>
    if((false)){
        var a = 1;
    }
    alert(a);
    </script>
    var a;
    if("a" in window) {
        a =1;
    }
    alert(a);
      

  23.   

    明明是undefined 为啥那么多人说是1呢?
      

  24.   

    定义 a的优先级是最高,所以正确代码是var a;
    if(("a" in window)){
        a = 1;
    }
    alert(a);