JavaScript预编译的13个基础知识点

news/2024/7/19 15:13:56 标签: javascript, js

JavaScript引擎的两大步骤:

  • 预编译(第一次/前置扫描) — 变量 函数等声明

  • 解释执行(第二次扫描)

预编译 - 脚本
脚本:

  • 创建全局对象GO(Global Object)

  • 加载脚本文件

    预编译:

  • 找出所有的变量声明,按照变量名加入全局对象,如果已经存在,忽略。

  • 找出所有的函数声明,按照函数名加入全局对象,如果已经存在同名变量或者函数,替换。

    解释执行

脚本的预编译
1.如果遇到没有var的变量,都不是变量声明,全部都认为是局部变量,不参与预编译。
示例代码:

	console.log(aa);
	aa = 5;
	console.log(aa);

2.即使aa在函数中,aa也是全局变量,是运行时生效,不是预编译时生效。

	console.log(aa);
	test();
	function test(){
		aa = 5;
		// console.log('Hello!');
	}
	console.log(aa);

3.脚本中,所有的变量声明,在脚本的预编译阶段完成,所有的变量声明与实际的书写位置无关。

javascript">console.log(a);   // undefined
			var a = 5;
			console.log(a);		// 5

4.脚本中,所有的函数声明,在脚本的预编译阶段完成,所有的函数声明与实际的书写位置无关。

javascript">console.log(f);
			function f(){
				console.log('哈哈');
			}

5.脚本中,如果变量与函数同名,那么函数将覆盖变量

javascript">console.log(f);  // 输出函数
			var f = 123;
			console.log(f); // 输出变量  被赋值影响
			function f(){
				console.log('哈哈哈');
			}
			console.log(f); // 输出变量

6.脚本中,如果变量与函数同名,函数可以覆盖变量,变量无法覆盖函数。

javascript">console.log(f); // 输出函数

			function f(){
				console.log('hahha');
			}

			var f = 123; 

7.脚本中,如果有多个函数同名,最后声明的函数将覆盖所有前面的同名函数声明。并且,参数个数是忽略的,也就是说,JS压根不支持重载。

	console.log(f);
	function f(x){
		console.log('haha1')
	}
	function f(x,y){
		console.log('haha2')
	}

预编译 - 函数调用
函数调用:
创建活动对象AO(Active Object)
预编译:

  • scope chain

  • 初始化arguments

  • 初始化形参,将arguments中的值赋值给形参

  • 找出所有的变量声明,按照变量名加入AO,如果已经存在,忽略。

  • 找出所有的函数声明,按照函数名加入AO,如果已经存在同名变量或者函数,替换。

    解释执行

8.函数中,所有变量声明,在函数的预编译阶段完成,所有变量的声明与实际的书写位置无关。

    function f(){
        console.log(a);
        var a = 25;
        console.log(a)
    }
    f();

9.函数中,所有函数声明,在函数的预编译阶段完成,所有函数的声明与实际的书写位置无关。

   function f(){
       console.log(fin);
        function fin(){
            console.log('hahha');
        }
    }
    f();

10.函数中,如果变量与函数同名,那么函数将覆盖变量

   function f(){
        console.log(fin);
        var fin = 123;
        console.log(fin);
        function fin(){
            console.log('haha');
        }
    }
    f();

11.函数中,只有函数能够覆盖变量,变量无法覆盖函数

javascript">   function f(){
            console.log(fin);
            function fin(){
                console.log('haha');
            }
            var fin = 123;
        }
        f();

12.函数中,如果有多个函数同名,最后声明的函数将覆盖所有前面的同名函数声明。并且,参数个数是忽略的,也就是说,JS压根不支持重载。

    function f(){
        console.log(fin);

        function fin(x){
            console.log('haha1');
        }

        function fin(x){
            console.log('haha2');
        }
    }
    f();

13.当函数预编译后,遇到需要访问的变量或者函数,优先考虑自己AO中定义的变量和函数。如果找不到,才会在其定义的上一层AO中寻找,直至到GO,再找不到才报错。

     var scope = 'global';
    function f(){
        console.log(1,scope);   // undefined
        var scope = 'local';
        console.log(2,scope);   // 'local'
    }
    f();
    console.log(3,scope);   // 'global'

JavaScript的预编译是个比较重要的知识点,大家要结合代码深入理解一下。
有什么问题可以联系QQ:505417246
关注下面微信公众号,可以领取微信小程序、Vue、TypeScript、前端、uni-app、全栈、Nodejs等实战学习资料
在这里插入图片描述


http://www.niftyadmin.cn/n/1576689.html

相关文章

ELK - 简谈 logstash flume

现主流的日志分析系统有 logstash 和 flume,结合好多网上前辈的说法,汇总了一下,希望和大家分享与探讨,有不同的想法欢迎留言。Flume Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传…

数据结构面试题以及答案整理

参考网络整理的一些问题 一、什么是数据结构? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。结构包括逻辑结构和物理结构。 数据的逻辑结构包括4种 (1)集合:数据元素之间除了有相同的数据类…

信号频谱

2019独角兽企业重金招聘Python工程师标准>>> 频谱是指一个时域的信号在频域下的表示方式,可以针对信号进行傅里叶变换而得,所得的结果会是以分别以幅度及相位为纵轴,频率为横轴的两张图,不过有时也会省略相位的信息&am…

微信小程序实现长按复制和点击复制

我们在进行微信小程序开发时&#xff0c;经常会遇到用户通过长按文字复制和用户通过点击事件复制指定内容的需求。 长按复制: 微信小程序中text标签中有一个selectable属性可以满足我们的需求&#xff0c;我们只需要把属性的值设置为true即可。 <text selectabletrue>哈…

B站狂神说Java学习笔记–基础

B站狂神说Java学习笔记–基础 01注释 单行、多行、文档 //单行注释/*多行 注释*//*** Description HelloWorld* author Jane*/02标识符 字母、美元符、下划线&#xff08;_&#xff09;开头 可以中文命名&#xff0c;但不建议 03数据类型 Java属于强类型语言&#xff1a…

JavaScript数据类型转换(Number)

目录&#xff1a; JavaScript——数据类型转换(Number) JavaScript——数据类型转换(String) JavaScript——数据类型转换(Boolean) 我们在进行前端JavaScript开发中&#xff0c;经常遇到需要判断数据类型和数据类型转换的需求&#xff0c;其中又分隐式和显式。我们解决一下~~~…

1175: 零起点学算法82——find your present

1175: 零起点学算法82——find your present Time Limit: 1 Sec Memory Limit: 2 MB 64bit IO Format: %lldSubmitted: 1804 Accepted: 418[Submit][Status][Web Board]Description In the new year party, everybody will get a "special present".Now its your…

B站狂神说Java学习笔记--流程控制

B站狂神说Java学习笔记–流程控制 01用户交互Scanner java.util.Scanner 通过Scanner类来获取用户的输入 基本语法&#xff1a; Scanner s new Scanner(System.in); 通过Scanner类的next()与nextLine()方法获取输入字符串 读取前一般需要使用hasNext()与hasNextLine()判…