存在形式:匿名函数 function定义的 函数存储过程:开辟一个堆内存,把函数当做‘字符串’存储起来。 形参是定义的时候编写的 实参是执行的时候传递的 arguments是实参的集合,也叫类数组(类数组包括 元素集合和arguments) return:1.决定函数的返回值2.打断函数的执行 this: 函数的主体 var a =10,b=20;相当于var a=10;var b=20; var c=d=20;相当于var c =20;d=20;d没有变量提升
变量提升
原理:代码执行之前,js会把代码中带var 和带 function的变量提前声明
var:只声明不定义 默认值是undefined
function:既声明又定义
js的运行机制
变量提升对于条件语句来说,不管是否成立,都会进行变量提升
在条件语句或者循环语句中的大括号包着的function声明,高版本浏览器只声明不定义
变量提升只提升=左边的,return后边的也不提升
let和const不存在变量提升,但是有暂时性死循环:就是在声明之前不能调用
想用他们声明的变量 要在下边使用 :就是先声明在使用
作用域
let const var 三者之间的区别
1.var可以重复声明,生命的变量存在提升,声明的变量会在window下增加一个对应的属性。
而let 和const都不可以重复声明,不存在变量提升,不会在window下增加属性。但是let和const可以识别块级作用域
2.作用域:就是一块栈内存
堆内存:存储引用类型
栈内存:存储值类型(私有作用域),也提供代码的运行环境
全局作用域:页面一打开的时候就会形成一个全局作用域,一根页面只有一个全局作用域
私有作用域:函数执行的时候就会形成私有作用域
块级作用域:判断语句、循环语句、大括号包起来的部分:let、const可以识别:在这里边声明的function只声明不定义。
上级作用域:(只有私有作用域才有)函数执行的那个私有作用域,一般都会存在一个上级作用域:上级作用域是谁?跟函数在哪执行么有关系,只跟函数在哪个作用域定义有关。
函数执行:先有形参赋值,再有变量提升。
作用域链:私有作用域的变量有可能不是该私有作用域的私有变量,这时该变量对应的取值,先在自己的作用域查找,如果找不到就需要去上一级的作用域查找,还找不到,就去window找,扔找不到就会报错。(私有作用域没有形参也没有私有变量,这时就往上级作用域查找)
上述的作用域链这种机制就是
函数执行的过程:先开辟一个私有作用域(栈内存),然后形参赋值,变量提升,代码从上到下执行。
全局变量:全局作用域声明的变量
私有变量:私有作用域声明的变量(形参也是私有变量)
如果一个函数有形参也有实参:实参就是全局定义的值