三十二.同名标识符提升

58 阅读2分钟

标识符提升

1)每一个作用域在运行时,js引擎会先把作用域内部的关键字(var和function)提前扫描并隐式声明,再正常执行代码。

2)变量只提升声明不赋值,函数提升的是整个函数体(声明整个函数)但是(定义式不会提升)对象内部的方法不会提升只有对象生成才会生成函数。

函数在执行过程中,第一步是扫描函数然后隐式操作把var修饰的变量提前声明但不会赋值,赋值是在运行到相应代码行才会赋值操作。

image.png

image.png

image.png

image.png

同名标识符提升

1)变量和函数同名时:变量先提升然后是函数

image.png

image.png

2)变量和变量同名时:变量名覆盖相当于重新赋值,取值时就近优先(先写先扫描)

image.png

image.png

3)函数和函数同名时:与变量和变量同名时同理,先写先扫描,但是函数是提升整个函数,包括函数体。

image.png

image.png

总结

函数调用时,相当于函数内部的作用域开始运行代码,那么这个作用域运行代码时会先把一些操作提前执行

形(形参和变量,形参隐式声明和var修饰的变量一起提升)实函运指js引擎执行代码的流程

顺序就是:
1.先把函数内部的形参和局部变量提前声明

2.再把实参赋值给形参变量

3.然后再把内部的局部函数提前声明(必须是声明式的函数,就是function开头)

4.再按照代码顺序执行代码(执行的过程中这个作用域内部有已经隐式提前声明的变量和函数就不再声明了)

全局作用域中没有形参隐式提升和实参赋值。

image.png

image.png