一 预编译之前基本概念:
1 函数形参(parameter)和实参(argument)的区别:形参相当于函数中定义的变量,实参是在运行时的函数调用时传入的参数。即:形参就是函数声明时的变量,实参是我们调用该函数时传入的具体参数。
1 function add(a, b) { 2 return a + b // a,b就是形参 3 }; 4 add(1, 2) // 1,2就是实参
2 js变量名与函数重名问题:https://blog.csdn.net/Charles_Tian/article/details/79775909
注意:函数作用域是首先从内部查找,由里向外顺序查找.
- 要知道js解析变量声明的顺序
- 函数声明和变量声明会置顶且函数声明更优先!
- 作用域链的查找顺序是由里向外,js执行代码顺序是自上往下
二 js预编译过程:https://blog.csdn.net/qq_42383764/article/details/105229455
js运行代码共分三步
1. 语法分析,语法分析就是浏览器先浏览一下整体的代码有没有少写分号、单词拼错等语法的错误。
2. JS预编译。本质是创建AO对象或GO对象,对其属性的操作。预编译发生在函数执行前一刻。
3. 解释性执行。就是一行一行的读取代码执行代码。
全局域解析:GO:Gobel Object,是全局对象,GO对象跟window对象是同一个对象。可以理解为window对象有两个名字 window == GO。
函数JS预编译:AO对象:Activation Object,指活动性对象,也叫执行期上下文,就是我们通常所说的作用域。这里指函数的局部作用域。预编译时AO对象的属性对应的属性值,会在后续代码执行过程中发生变化,也就是会被覆盖。