原理:代码执行以前,js会把代码中带var 和带 function的变量提早声明数组
var:只声明不定义 默认值是undefined浏览器
function:既声明又定义函数
变量提高对于条件语句来讲,无论是否成立,都会进行变量提高this
在条件语句或者循环语句中的大括号包着的function声明,高版本浏览器只声明不定义cdn
变量提高只提高=左边的,return后边的也不提高blog
let和const不存在变量提高,可是有暂时性死循环:就是在声明以前不能调用内存
想用他们声明的变量 要在下边使用 :就是先声明在使用作用域
let const var 三者之间的区别字符串
1.var能够重复声明,生命的变量存在提高,声明的变量会在window下增长一个对应的属性。it
而let 和const都不能够重复声明,不存在变量提高,不会在window下增长属性。可是let和const能够识别块级做用域
2.做用域:就是一块栈内存
堆内存:存储引用类型
栈内存:存储值类型(私有做用域),也提供代码的运行环境
全局做用域:页面一打开的时候就会造成一个全局做用域,一根页面只有一个全局做用域
私有做用域:函数执行的时候就会造成私有做用域
块级做用域:判断语句、循环语句、大括号包起来的部分:let、const能够识别:在这里边声明的function只声明不定义。
上级做用域:(只有私有做用域才有)函数执行的那个私有做用域,通常都会存在一个上级做用域:上级做用域是谁?跟函数在哪执行么有关系,只跟函数在哪一个做用域定义有关。
函数执行:先有形参赋值,再有变量提高。
做用域链:私有做用域的变量有可能不是该私有做用域的私有变量,这时该变量对应的取值,先在本身的做用域查找,若是找不到就须要去上一级的做用域查找,还找不到,就去window找,扔找不到就会报错。(私有做用域没有形参也没有私有变量,这时就往上级做用域查找)
上述的做用域链这种机制就是
函数执行的过程:先开辟一个私有做用域(栈内存),而后形参赋值,变量提高,代码从上到下执行。
全局变量:全局做用域声明的变量
私有变量:私有做用域声明的变量(形参也是私有变量)
若是一个函数有形参也有实参:实参就是全局定义的值