前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JavaScript】预解析 ② ( 预解析示例分析 | 分步骤分析预解析过程 )

【JavaScript】预解析 ② ( 预解析示例分析 | 分步骤分析预解析过程 )

作者头像
韩曙亮
发布2024-04-20 08:39:28
660
发布2024-04-20 08:39:28
举报

一、预解析示例分析一

1、要分析的代码

要分析的 代码示例 :

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 预解析示例

        var num = 666;

        fun();

        function fun() {
            console.log(num);
            var num = 888;
        }
    </script>
</head>

<body>
</body>

</html>

执行结果如下 :

2、代码预解析分析

给定如下代码 , 分析 JavaScript 预解析过程 ;

代码语言:javascript
复制
        var num = 666;

        fun();

        function fun() {
            console.log(num);
            var num = 888;
        }

分析上述代码 的 预解析过程 :

全局作用域 的 var num = 666; 变量 , 进行 预解析 , 提升该变量 到 全局作用域 顶部 , 提升后的效果如下 :

代码语言:javascript
复制
		// ★ 本步骤要点
		var num;
        num = 666;

        fun();

        function fun() {
            console.log(num);
            var num = 888;
        }

全局作用域 的 fun 函数 预解析 , 将该函数 提升到 全局作用域 最顶部 , 在 var num 的下方 ;

代码语言:javascript
复制
		var num;
		// ★ 本步骤要点
        function fun() {
            console.log(num);
            var num = 888;
        }
        num = 666;

        fun();

fun 函数 的 局部作用域 中的 var num = 888; 变量 进行 预解析 , 将该 变量 在 局部作用域 中 提升到 最顶端 ;

该提升操作 , 也是只提升变量声明 , 变量 初始化赋值 操作 仍然保留在原地 ;

代码语言:javascript
复制
		var num;
        function fun() {
        	// ★ 本步骤要点
        	var num;
            console.log(num);
            num = 888;
        }
        num = 666;

        fun();

这是 JavaScript 预解析 的最终 结果 ;

3、作用域链分析

预解析结果如下 :

代码语言:javascript
复制
		var num;
        function fun() {
        	var num;
            console.log(num);
            num = 888;
        }
        num = 666;

        fun();

在 fun 函数的 局部作用域中 , 执行 console.log(num); 代码 , 打印 num 变量的值 ,

num 变量查找 , 需要沿着 上述 JavaScript 代码的 作用域链 逐层 向上查找 ,

优先 查找 局部作用域 num 变量 , 然后再向上 查找 全局作用域 中的 num 变量 ;

在 fun 函数 的 局部作用域 中 , 找到了 num 变量 , var num; , 但是 该 num 变量 只进行了 声明 , 没有进行初始化 操作 ,

在 num 变量 声明后 , 未初始化前 , 打印 num 的值为 undefined ;

二、预解析示例分析二

1、要分析的代码

要分析的 代码示例 :

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 预解析示例

        var num = 666;
        fun();
        function fun() {
            var num2 = 333;
            console.log(num);
            console.log(num2);
            var num = 888;
        }
    </script>
</head>

<body>
</body>

</html>

执行结果 :

2、代码预解析分析

给定如下代码 , 分析 JavaScript 预解析过程 ;

代码语言:javascript
复制
        var num = 666;
        fun();
        function fun() {
            var num2 = 333;
            console.log(num);
            console.log(num2);
            var num = 888;
        }

先 预解析 全局作用域的 num 变量 , 将 var num; 提升到 全局作用域最顶端 , num 变量初始化仍然留在原地 , 完成后代码变为 :

代码语言:javascript
复制
		// ★ 本步骤要点
        var num;
        num = 666;
        fun();
        function fun() {
            var num2 = 333;
            console.log(num);
            console.log(num2);
            var num = 888;
        }

然后 将 fun 函数声明 , 提升到 全局作用域 顶端 , 全局 num 变量声明 的 下面 ;

代码语言:javascript
复制
        var num;
        // ★ 本步骤要点
        function fun() {
            var num2 = 333;
            console.log(num);
            console.log(num2);
            var num = 888;
        }
        num = 666;
        fun();

再后 对 fun 函数 局部作用域 的 num2 和 num 进行预解析 , 将 变量 声明 提升到 局部作用域 的顶端 , 将 变量 初始化赋值 留在原地 , 预解析后的结果如下 :

代码语言:javascript
复制
        var num;
        function fun() {
        	// ★ 本步骤要点
            var num2;
            var num;
            num2 = 333;
            console.log(num);
            console.log(num2);
            num = 888;
        }
        num = 666;
        fun();

在上述 fun 函数 局部作用域 , 打印 num 变量时 , 局部作用域 的 num 变量还没有 初始化 , 打印的值为 undefined , 打印 num2 变量时 , 局部作用域 的 num2 变量 已经赋值 333 , 因此执行结果如下 :

三、预解析示例分析三

1、要分析的代码

要分析的 代码示例 :

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 设置 meta 视口标签 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no,maximum-scale=1.0,minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JavaScript</title>
    <style></style>
    <script>
        // 预解析示例

        fun();

        console.log(num1);
        console.log(num2);
        console.log(num);

        function fun() {
            var num = num1 = num2 = 888;
            console.log(num);
            console.log(num1);
            console.log(num2);
        }
    </script>
</head>

<body>
</body>

</html>

执行结果 :

2、预解析过程分析

预解析的代码 :

代码语言:javascript
复制
        fun();

        console.log(num1);
        console.log(num2);
        console.log(num);

        function fun() {
            var num = num1 = num2 = 888;
            console.log(num);
            console.log(num1);
            console.log(num2);
        }

全局作用域 的 fun 函数预解析 , 将 该函数 提升到 全局作用域 的最顶端 ;

代码语言:javascript
复制
		// ★ 本步骤要点
        function fun() {
            var num = num1 = num2 = 888;
            console.log(num);
            console.log(num1);
            console.log(num2);
        }
        
        fun();

        console.log(num1);
        console.log(num2);
        console.log(num);

下面分析 局部作用域的 var num = num1 = num2 = 888; 语句 , num1 和 num2 变量 没有经过声明直接使用 , 这两个变量等同于 全局变量 ;

这里将这两个变量 提升到全局作用域 的最顶端 ;

本步骤预解析结果如下 :

代码语言:javascript
复制
		var num1;
		var num2;
		// ★ 本步骤要点
        function fun() {
            var num; 
            num2 = 888;
            num1 = 888; 
            bnum = 888;
            console.log(num);
            console.log(num1);
            console.log(num2);
        }
        
        fun();

        console.log(num1);
        console.log(num2);
        console.log(num);

在 fun 函数内部 , 可以打印出 3 个变量的值 888 ;

在 全局作用域中 , 可以打印出 num1 和 num2 的值 888 , 但是 num 变量是 fun 函数的 局部变量 , 访问不到 , 因此 全局作用域 打印 num 变量会报错 ;

代码语言:javascript
复制
Uncaught ReferenceError: num is not defined
    at hello.html:17:21
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、预解析示例分析一
    • 1、要分析的代码
      • 2、代码预解析分析
        • 3、作用域链分析
        • 二、预解析示例分析二
          • 1、要分析的代码
            • 2、代码预解析分析
            • 三、预解析示例分析三
              • 1、要分析的代码
                • 2、预解析过程分析
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档