有时会遇到,functon a(){},写下最下面,在上面调用仍然可以使用,而var a = function(){},同样的位置,在调用时却会报错,
以及变量先使用后声明,或许正常,或许undefined,
这就涉及到了提前声明的一些知识。
js在执行前会进行一些初始化操作,将变量,函数声明(这里是声明,不是表达式),以及函数参数,提前初始化,只是初始化,变量是不会赋值的。
以浏览器为例,最外层,js会生成vo(variable object)执行上下文,进行全局的初始化,函数声明内部,会生成ao,进行函数声明内部的初始化,
ao最终会归为vo内。
vo初始化也会有一些规则,函数参数,如果没有地方调用它,参数默认为undefined;
同名规则(不分变量,函数,出现名字相同就算同名):
对于变量,会进行忽略操作,也就是后面解析到重名的变量,不会理睬,已前面的为主;
对于函数声明,会采取覆盖策略,后面出现的覆盖前面