JS 运行三部曲

1、语法分析

执行程序之前,JS 会 通篇扫描一遍,看看有没有语法问题。

2、预编译

//函数说明整体提升
//变量 声明提升

1.imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。

eg: a= 123;
eg: var a = b = 123;

window.a //undefined
window.b //123

2.一切声明的全局变量,全是 window 的属性

eg: var a =123; ==>window.a = 123;

3.预编译四部曲

1.创建AO对象
2.找形参名和变量声明,将变量名和形参名作为AO属性名,值为 undefined .
3.将实参值和形参统一
4.在函数体里面找函数声明。值赋予函数体。

预编译发生在函数执行的前一刻

1.创建AO对象(Actvation Object)(执行期上下文)

示例1:

image.png

image.png

示例2:

image.png

示例3:
image.png

结果是:1 ; 2 ;2 ;

示例4:
image.png

示例5:
image.png

示例6:

image.png

示例7:
image.png

百度面试**题1:**

image.png

1结果是:function

2结果是:11

百度面试**题2:**

image.png

image.png


image.png

4、作用域:

运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行上下文被销毁。

查找变量:从作用域链的顶端依次向下查找。

scope:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供 javascript引擎存取, Iscopel就是其中一个。

scope指的就是我们所说的作用域,其中存储了运行期上下文的集合。

作用域链: scope 中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。

image.png

5、闭包的作用

1.实现公有变量
eg:函数累加器
image.png

2.可以做缓存(存储结构)
eg:eater

3.可以实现封装,属性私有化。
eg:Person;

4.模块化开发,防止污染全局变量

6、立即执行函数

定义:此类函数没有声明,在一次执行过后立即释放。适合做初始化工作。

针对初始化功能的函数

image.png

  1. //(function (){}()) W3C建议使用这种用法
  2. //(function (){})();
  3. //只有表达式才能被执行符号执行
  4. function test() {
  5. var a=123;
  6. }
  7. test();

7、闭包

  1. function test() {
  2. var arr = [];
  3. for(var i=0;i<10;i++) {
  4. arr[i] = function() {
  5. document.write(i + " ");
  6. }
  7. }
  8. return arr;
  9. }
  10. var myArr = test();
  11. for(var j = 0; j < 10; j++) {
  12. myArr[j]();
  13. }