函数的变量提升小总结
函数
变量提升(预解析、预处理)
在全局只看2个东西(var和function)
一.
1、var a = undefined
遇见var不但会找到变量,并且给变量赋值undefined
如果2个变量名是一样的,下面把上面的覆盖即可
2.function a(){}
遇见函数直接把函数名提升并且赋值为整个代码块,
2个函数名字一样的情况下,下面把上面的覆盖
(只需要看最后一个函数就行)
3.变量名与函数名一样的情况下最终留下的是代码块(函数)
如果是函数声明那么就不会在读取了(只是预解析的那一次)
函数表达式是带等号的,所以会读
二.逐行解读代码
只看等号
变量和window的属性
当使用var来声明变量的时候,自动会给window上添加一个同名属性。
var a = '' window.a
有变量的时候才会和widnow的属性是相映射的
没有变量的时候,window的属性只有赋值之后才会挂上,如果在赋值之前访问
属性只是undefined
在全局范围中所有的属性,方法都属于window,没有主默认主是window
aa = > window.aa
window.aler
in是运算符,它能够运算某个属性是不是这个对象的
'属性名' in 对象
有:true
没有:false
简单类型的属性
没有会是undefined,自定义也是undefined,自身有那么就是后面的值
经过试验,chrome下70版本
当window中默认属性的值为是字符串时,并且在var变量赋值数字时,
结果会为字符串
name,defaultStatus,status...
一般情况下,对象的属性能读能写,写什么,读的就是什么。
局部作用域:
在函数中或者块中有的作用域。
在局部作用域中有自己的一套预解析机制、逐行解读代码并且赋值。
特点:(词法作用域)
如果是函数套函数的情况下,越里面的函数中的变量优先级就越高.
子函数没有,会去父函数中查找,如果还没有再到外层查找,
直到找到window,如果都没有就报错。
不能父函数找子函数(从里往外找,不允许从外往里找)。
ES6中有了块的概念
{
}
使用let||const是支持块级作用域的,let或者const只会作用于在块
如果在块中有声明函数,那么在这个块中的任何地方都能找到这个代码块
如果不在这个块中,并且为声明之前访问块中的函数,
那么值为undefined
传参
函数内先看有没有变量,如果没有变量还会去找参数有没有
优先级:
先找函数内的变量,如果变量为undefined,才找参数
参数有:走参数,
如果是简单类型的数据并且内部修改这个值,外部是不会受到影响
如果是复合类型的数据并且内部修改了这个类型的值,外部也是会受到干扰的
注意:
如果函数内部的参数被修改地址了,此时,修改内部对象是不会影响外部对象的。
参数没有就找父级,直到window
在函数中,如果有形参并且赋值而且还有变量,在声明变量的上方访问
那么结果是实参。