js回顾_代码执行顺序
一、js代码执行分为两个阶段
1、预编译阶段(找VAR , FUNCTION 以及参数)
此阶段进行变量和函数的声明,但是不对变量进行赋值、不访问变量对象属性,变量的默认值为undefined。
解析原则:
⑴ 重名变量或重名函数,保留最后的一个;
⑵ 变量和函数重名,只保留函数;
2.根据作用域链,来查找上文第一步中提到的需要被解析的东西
查找原则:从上到下,从里到外
即先找局部作用域里找,然后子对象会一级一级向上寻找所有父对象的变量。
2、代码执行阶段(逐行解读代码)
此阶段对变量进行赋值和函数的声明。

注:作用域链:当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain,不简称sc)来保证对执行环境有权访问的所有变量和函数的有序访问。
整个作用域链的本质是一个指向变量对象的指针列表。作用域链的最前端,始终是当前正在执行的代码所在环境的变量对象。
在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量,因为全局变量总是存在于运行期上下文作用域链的最末端,查找是最慢的。

alert(a); // function a(){alert(4);} var a=1; alert(a); // 1 function a(){alert(2);} alert(a); // 1 var a=3; alert(a); // 3 function a(){alert(4);} alert(a); // 3 a(); //报错
首先看一下执行经过:
1、预编译阶段:
(1)、前提:以上案例在全局环境中,
找变量、函数a;变量统一为undefined。
即对应2,4,6,8行:undefined,function a(alert(2);),undefined,function a(alert(4);)
(2)、根据解析原则:变量与函数重名保留函数
即a最终赋值为function a(alert(4);)
2、代码执行阶段:
首先第一行执行预编译结果;然后第二行定义a为一个变量,从上到下执行;由于变量不能以函数方式进行,故会报错。
三、变量提升与函数提升
1、变量提升
在指定作用域里,从代码顺序上看是变量先使用后声明,但运行时变量的 “可访问性” 提升到当前作用域的顶部,其值为 undefined ,没有 “可用性”。
即把变量声明提升到当前执行环境的最顶端
2、函数提升
把函数声明提升直接把整个函数提到执行环境的最顶端
只有函数声明才存在函数提升
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {} var f2 = function() {}
3、通过使用let、const代替var可以解决变量提升。
最后,感谢一下大佬的资料,帮我解决了这个疑惑!

浙公网安备 33010602011771号