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可以解决变量提升。

最后,感谢一下大佬的资料,帮我解决了这个疑惑!

 

posted @ 2018-08-30 10:18  影之殇  阅读(210)  评论(0)    收藏  举报