js是分块实行的,而且是会先实行定义,所以会先实行function sayHi(){ 
alert("Hi, Xian!"); 

</script>   </body> 然后再实行上面的sayHi();所以没问题。
如果你把上面的函数这样写var sayHi = function (){ 
alert("Hi, Xian!"); 

然后再sayHi()就会有错了。因为这种不是先定义函数,而是变量付值的形式

解决方案 »

  1.   

    js执行顺序并不是简单的从上到下来执行的,我测试了一下,应该是根据<script>块顺序来解释执行的。
    测试代码:
    <script>   
    try {   
        fnTest();   
    } catch(e) {   
        alert("error occurs:" + e.description );   
    }   
    </script>   
    <script>   
    function fnTest() {   
        alert("fn1()");   
    }   
    </script> 
    若执行上述代码,则会提示没有对象的错误,因为fnTest()函数定义所在<script>块在使用该函数的<script>块后
    但若换成如下代码,则可以执行,原因是由于fnTest()函数定义与其调用在同一脚本块中
    <script>   
    try {   
        fnTest();   
    } catch(e) {   
        alert("error occurs:" + e.description );   
    }   
    function fnTest() {   
        alert("fn1()");   

    </script>  
      

  2.   

    IE和FireFox 都报错, 楼主居然说不报错 ?!!