函数的变量提升小总结

函数


变量提升(预解析、预处理)

在全局只看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
在函数中,如果有形参并且赋值而且还有变量,在声明变量的上方访问
那么结果是实参。

代码的世界很精彩,好的代码需要慢慢的打磨。
原文地址:https://www.cnblogs.com/Allisson/p/9872439.html