js用浅的上手快,用深入没过十年八年内功真的不行,丝毫不差于c++和汇编语言, 有很多莫名的诡异不认真测试还真想不到,看下面代码<SCRIPT LANGUAGE="JavaScript">    
a();  
function a(){  
     var x=1;  
     function b(){  
         document.writeln(x);  
         var x=2;  
         document.writeln(x);  
    }  
   b();  
   
}  
</SCRIPT>  变量x到底是定义还是没定义,到底能不能访问,不是由前面说了算,而是后面说了算,上面输入结果为:undefined 2 也就是说第一个x没找到,那么再改一下
<SCRIPT LANGUAGE="JavaScript">    
a();  
function a(){  
     var x=1;  
     function b(){  
         document.writeln(x);  
   
         document.writeln(x);  
    }  
   b();  
   
}  
</SCRIPT>  现在输出2 2 也就是两次检查x都找到了,天啊 ,到底认不认识x变量得后面的脸色 

解决方案 »

  1.   

     var x=1;  
         function b(){  
             document.writeln(x);  
             var x=2;  
             document.writeln(x);  
        }  
       b();  
    其他编程语言你按这个逻辑写看看什么结果
      

  2.   

    1.js在页面加载过程中顺序执行。但是分块预编译、执行。
    2.JS 在执行前会进行类似"预编译"的操作,而且先预声明变量再预定义函数。
    此时注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
    3.(注意)并不是先全文编译完在执行,而是块编译,即一个script块中,预编译再执行,然后(按顺序)下一个script块,预编译再执行,但此时上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
    4.变量没声明就引用,会报错,但对象方法,对象变量没声明,是undefined
    5.在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量
    6.在执行函数时时也是先编译后执行,但要注意函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。
      

  3.   

    其它语言会输出 1 2  第一个会输出全局的x =1 当局部又定义相同名的变量时,优先取局部变量,绝大数高级语言就这样做的,js想别出新裁也要符合一下人的起码常识,怎么猜都猜出来结果是出乎意料的,如果不亲自执行的话,如下面几个语文看起差不多,但执行的结果是完全不相同的
    <SCRIPT LANGUAGE="JavaScript">  
    document.writeln(a);  
    var a=0;  
    </SCRIPT>  
    执行结果undefine
    <SCRIPT LANGUAGE="JavaScript">  
    document.writeln(a);  
    a=0;  
    </SCRIPT>
    执行报错
    <SCRIPT LANGUAGE="JavaScript">  
    var a=0; 
    document.writeln(a);   
    </SCRIPT>  
    输出0
    看你疯不疯
      

  4.   

    lz,你说你第二次运行的时候2次输出都是2?你明明x=1;怎么可能打印出2来呢?你是不是什么地方代码写错咯,
      

  5.   

    <SCRIPT LANGUAGE="JavaScript">    
    a();  
    function a(){  
         var x=1;  
         function b(){  
             document.writeln(x);  
             var x=2;  
             document.writeln(x);  
        }  
       b();  
       
    }  
    </SCRIPT>  因为a()里面有两个x 的定义,所以第一个指令被摈弃了,等于没有
    你修改了之后,只有一个定义式了,所以就都可以被检查到了你可以修改成<SCRIPT LANGUAGE="JavaScript">    
    a();  
    function a(){  
         var x=1;  
         function b(){  
             document.writeln(x);  
             x=2;  
             document.writeln(x);  
        }  
       b();  
       
    }  
    </SCRIPT>
      

  6.   

    预编译时确定变量x的作用域在函数内,逐行解析时第一次输出变量在函数内未给变量赋值,所以其值是undefined。
      

  7.   

    参见:http://www.jslab.org.cn/?tag=predefinedhttp://www.jslab.org.cn/?tag=ScopeChainAndClosurehttp://www.jslab.org.cn/?tag=prototypeChain