javascript

javascript基础-编译和执行顺序

之前看过一片很通俗易懂的关于js编译和执行顺序的文章,现在后过头来看,还是觉得有用处,对原文章做了整理和完善。

JS是一段一段执行的(以<script>标签来分割),执行每一段之前,都有一个"预编译",预编译干的活是:声明所有var变量(初始为undefined),解析定义式函数语句。

还有个关于 "window作用域下,a = 1和var a = 1" 的区别的也很经典:

a = 1相当于window.a = 1,是动态地为window添加一个成员;
var a = 1是在当前作用域(也就是window)下声明一个a,这个声明是在整个作用域内都有效的。

换句话说,其实区别就在于var a = 1比a = 1多了一个声明的行为。

我们看看几个例子

//例子1
<script>
    alert(t);
    alert('ok');
    t = 2;
</script>
//运行以上代码后会报错:Uncaught ReferenceError: t is not defined因为这个时候alert(t)中的t并未声明

//例子2
<script>
    alert(t);
    alert('ok');
    var t = 2;
</script>
//运行以上代码后会弹出两个窗口:undefined和OK
//预编译的时候,声明了变量t;执行到alert(t)这行代码的时候,t尚未被赋值,所以弹出undefined

//例子3
<script>
    a();
    function a() {}
    alert('ok');
</script>
//弹出ok。预编译的时候,解析了定义式函数语句function a() {},顺利执行。

//例子4
<script>
    a();
    var a = function() {};
    alert('ok');
</script> 

//a不是函数,执行报错。预编译的时候,声明了变量a = undefined;
//执行到a()时,a还等于undefined,不是函数,所以执行a()会报错。

//例子5
<script type="text/javascript">
    a();
    alert('first block');
</script>
<script type="text/javascript">
    alert('second block');
</script>
//弹出"second block" 同时报错:Uncaught ReferenceError: a is not defined
//因为js是按段执行的,第一段中a未声明,导致整段出错,后面的也不会执行。但是第二段不受影响


原文链接:http://www.cnblogs.com/yizuierguo/archive/2009/03/26/1422667.html

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章