作用域分为:全局作用域和函数作用域在es6中还有块作用域
作用域的定义:就是变量能够作用(使用)的范围
一. 全局作用域
定义:全局作用域就是全局对象(GO)就是window对象,通俗一点就是在任何地方都可以访问到变量就是全局变量,对应的就是全局作用域。
二. 函数作用域
只在固定的代码片段内可以访问到的变量,在函数(function)内的变量就是局部变量要调用时才能访问里面的代码。局部变量对应得就是局部作用域(函数作用域)
注意:
1.在函数内定义变量时没有用(var或者let等声明变量的词)声明的变量就是全局变量(隐式全局变量)而不是局部变量。
2.局部变量退出作用域之后会销毁,全局变量关闭网页或者浏览器时才会销毁并会消耗cpu产生垃圾。所以在写网页时尽量使用局部变量。
三。全局变量与局部变量
1.全局变量
定义:全局变量在整个程序代码中都能调用
2.局部变量
定义:只能在函数内部调用,在函数外部是不能调用的,
例:

但是全局变量在函数中能调用的。
例:

if里面的变量也是全局变量
例:

五. js解释引擎解释执行js代码的过程
在js代码执行的过程中,会先通篇扫描所有的代码看是否有语法的错误。 如果语法错误会直接报错,代码不再执行。报语法错误的语句:Uncaught SyntaxError:Invalid or unexpected token。语法没有错误的话会进入预编译阶段。
5.1预编译的四个步骤
1.创建AO对象,AO就是活动对象,又叫作用域,也叫执行期上下文(局部对象)
.GO对象就是全局对象
2.找到形参和变量,把形参和变量作为AO对象的属性名,值是undefined
3.实参把值赋给形参
4.在函数中找到函数声明,把函数名作为AO对象的属性名,值是函数
5.2.全局代码执行的三部曲
5.2.1. 创建全局对象,全局的仓库
5.2.2. 找到变量声明,提升变量声明 // 变量提升
5.2.3. 找到函数声明, 提升函数声明
3. 执行代码
js代码的执行是单线程的,会解释一行执行一行
5.3.全局对象解释完了之后开始进行函数对象的执行
1.进行语法解析
2.到预编译阶段
2.1.1. 创建AO对象
2.1.2找到变量声明和形参,赋予默认值为undefined
2.1. 3. 将实参的值赋值给形参
2.1.4. 找到函数声明,然后提升
3.执行代码
示例:
代码执行的解释分析:
1.在全局对象中:
a.扫描全部代码没有语法错误
b.在全局中查找变量,函数
b.1没有变量,
b.2函数:function fn(a){}
2.全局分析结束之后到函数
a . 查找变量:
var a = undefind
var b = undefind
查找函数声明:
a:function a (){}
b:function b (){}
之后提升函数声明把变量
var a = undefind //把undefined换为 函数声明 function a (){}
var b = undefind //把undefined换为 函数声明 function b (){}
function fn (a){
console.log(a); // 所以这里的 a 输出函数名function a()
var a = 123; //把a = 123在覆盖 a = function a (){}
console.log(a); // 所以输出 123
function a (){}
console.log(a); // 123
console.log(b); //函数声明提升把 undefined换成了function b(){}所以这里输出function b(){}
var b = function (){}
console.log(b) //前面var b = function (){} 把 function b(){}覆盖了所以这里输出 function (){}
function b(){}
}
fn(1)