欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于JavaScript的一些基础

程序员文章站 2024-03-17 18:46:04
...

1.浏览器的js预处理

有如下的html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>example</title>
    <script>
        alert(a);
        var a = 12;
        function fn1() {
            alert(2);
        }
    </script>
</head>
<body>
</body>
</html>

浏览器逐行读取文件,在读取到<script>后,“JS解析器”开始了如下执行:

1)“找到一些东西” :例如 var function 参数 ……

        a = undefined

        所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

        fn1 = function fn1(){ alert(2)};

        所有的函数,在正式运行代码之前,都是整个函数块(注意格式)。

2) 逐行解读代码

        解析器去第一步的“仓库”里面寻找,例如一上来alert(a),发现a未定义,就会弹出undefined。

        注意:预解析的时候:同名的函数和未定义的变量,会留下函数;表达式可以修改预解析的值。

举个例子:在<script></script>中有如下代码:

        var a=1;
        function fn1() {
            alert(a);
            var a=2;
        }
        fn1();
        alert(a);
  1. 第一步解析器发现script标签:进入全局作用域。首先预解析:发现 var a(未定义); function fn1(……;
  2. 然后逐行执行代码:fn1();此时进入另一个域:局部作用域。还是进行那个套路
  3. 预解析:发现var a(未定义);逐行解析代码:alert(a);//此时弹出未定义。然后var a=2;(但是不影响全局变量的a)
  4. 返回全局作用域后,执行alert(a);弹出1。

如果把上面的例子中的fn1中的a的var去掉,在局部域执行代码的时候,如果找不到a回去全局作用域中去找。