JS在html中的执行顺序

    一般来说在html页面中嵌入Javascript的方式有下面几种:1.放在页面的<script></script>标记之间;2.由<script>标记的src属性引入外部的js文件;3.放在页面元素的事件处理程序中,比如button的onclick事件中;4.作为URL的主体,使用Javascript:协议,比如<a href="window.open("about:blank");"></a>;5.Javascript本身的document.write()写入的JavaScript代码;6.利用Ajax异步获取javascript代码.其中3,4需要事件的事件的触发才能执行,除非特别设置一般在页面加载时不会执行。5,6可以看做是js代码动态调用执行的,一般是在调用该代码的js执行时执行。

  下面看看<script></script>在html中所放的不同位置来看js的执行顺序。

js代码在js外部文件和<script></script>内的区别:

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript"src="test.js" ></script>
    <script type="text/javascript">
        alert("head中js");
        </script>
</head>
<body>
</body>
</html>

其中test.js为外部js文件,代码为:

alert("文件中js");

程序运行结果为先打印"文件中js",再打印"head中js",如果把<script src="test.js">放在后面,则是先输出"head中js",即浏览器是按<script>载入的先后顺序执行的。

一般来说每个脚本定义的全局变量和函数,都可以被后面执行的脚本所调用。变量的调用必须是在前面已经声明, 否则是undefined。而函数的调用可以在函数定义之前,前提是函数调用与定义在同一个<script></script>中,看下面的代码:

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
        alert(str);//程序打印出,undefined
       Sayhello("小明");//程序打印出,小明你好
        function Sayhello(name)
        {
            alert(name+"你好!");
        }
        var str="abcd";
        </script>
</head>
<body>
</body>
</html>

函数定义可以出现在函数调用的后面,但是如果是分别在两段代码,且函数调用在前面代码中,则会报函数未定义错误。

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
        Sayhello("小明");//浏览器报错Sayhello未定义
    </script>
    <script type="text/javascript">
        function Sayhello(name)
        {
            alert(name+"你好!");
        }
        var str="abcd";
        </script>
    <script type="text/javascript">
        Sayhello("小红");
        alert(str);
        </script>
</head>
<body>
</body>
</html>

程序正常打印''小红你好''和''abcd''。

在实际js的编程中,可能会页面<script>标签内的js代码中调用外部js文件中的变量或函数,这个需要js文件的加载在前,而调用在后。下面的代码可以说明:

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="test.js"></script>
   <script type="text/javascript">
       alert(num1);
       alert(num2)
      alert(sum(3,7));
   </script>
</head>
<body>
</body>
</html>

test.js中的代码:

var num1=2;
var num2=3;
function sum(a,b)
{
    return a+b;
}

程序正常输出,如果把test.js放在后面,调用却在前面,会出现undefined的错误。如果把js文件test.js放在后可以调用前面html页面<script>标签中的变量和函数,也可以调用前面的js文件中定义的变量和函数。

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
   <script type="text/javascript">
       var string1="abc";
       var string2="def";
       function Print(str1,str2)
       {
         alert(str1+str2) ;
       }
   </script>
    <script type="text/javascript" src="test.js"></script>
</head>
<body>
</body>
</html>

上面程序中string1,string2,Print声明或定义在前,在test.js中调用,test.js的代码为:

alert(string1);//输出abc
alert(string2);//输出def
var str1="12";
var str2="34";
Print(str1,str2);//输出1234

后面引用的js文件调用前面js文件中定义的变量和函数,把前面的html改为如下:

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript" src="test02.js"></script>
    <script type="text/javascript" src="test.js"></script>
</head>
<body>
</body>
</html>

test.js中的代码不变,调用前面test02.js中定义变量和函数,test02.js的代码如下:

var string1="abc";
var string2="def";
function Print(str1,str2)
{
    alert(str1+str2) ;
}

程序运行结果与前面一样,上面程序交换test.js和test02.js的先后会出现undefined的错误。这充分说明js外部文件和页面内<script>标签里的js代码一样,让先后顺序加载执行的。
下面来看看<script>加入html的不同位置执行的顺序:在<head>和<body>中以及与页面元素加载的先后关系

下面的程序对比<head>和<body>中js的执行顺序:

<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
        alert("我在head中");
    </script>
</head>
<body>
<script type="text/javascript">
    alert("我在body中");
</script>
</body>
</html>

上面程序先弹出"我在head中"后body中,与页面加载的顺序一致。放入<body>中的js随页面元素加载时执行。可以把js放在</html>的后面,在页面加载完成后执行,相当于onload事件中的代码。

综合上面所述情况可以归结为一点,即JavaScript代码是按页面加载的先后顺序执行的。(注上述代码在不同浏览器中执行的结果会有一些小差异)。

 

posted @ 2016-03-30 01:29  小小强001  阅读(3503)  评论(0编辑  收藏  举报