作用域
区域 变量+函数
作用:隔离变量,不同作用域下同名变量不会有冲突
声明变量
var function-----es5
let const class ----es6
变量的作用域
作用域是变量的可作用范围,变量只有在自己的作用域下才会生效。
函数会产生作用域,在函数内定义的变量只能在函数内使用。
作用域的分类
全局变量
声明的变量可以在任何位置使用
局部变量
- 在函数体内声明的变量和参数,只能在函数体内使用,不能被外面所使用
- 块级作用域---es6新增 (必须使用es6的声明方式)
练习
1.
2.
3.
浏览器底层运行机制
EC执行环境栈 EC(G)全局执行栈
全局变量:在全局作用域声明的变量(VO)
私有变量:在私有作用域声明的变量(AO) 目前是指函数体内声明的变量和形参
window 全局对象 没有声明方式的变量,默认存放在window中
作用域查找机制
- 先看自己的私有(AO) 有 -- 停止
- 没有---沿着作用链向上找 --- 找到停止
- 没有---沿着作用域链继续找---全局(VO)---找到停止
- 没有---window---没有,就是undefined
练习
1.
2.
3.
4.
变量提升
什么是变量提升
代码在执行的时候,并不是立刻执行的,先做变量提升
es6 没有变量提升 let const class
只有es5有 var function
var 声明提前,赋值在原来的位置
练习
function 声明+赋值都提前
变量提升的条件判断
-
无论if条件是否成立,都会进行变量提升
练习
重点 window是对象 window.a 表示对象window中的属性a
对象有 但属性不存在 显示undefined
当遇到if+{} function规则会改变,会块级作用域
情况一:不进if
1.function只声明 不赋值 (没进去)
情况二:进if
1.function只声明 不赋值 (没进去)
2.进入到if判断里面,会重新声明提前+赋值
函数分界线
练习
1.
2.
3.
4.
5.
只对等号左边的进行变量提升
var xxx=function(){}
练习
return 下面的代码进行变量提升,return后面的代码不进行变量提升
如果变量名字重复
只提升一次 后面直接赋值
var
function
练习