js(JavaScript)中的关于执行顺序 是一个挺头疼的事情,有不少朋友关于预编译 只记两句话:所有变量 声明整体提升,所有函数声明整体提升。确实 只记这两句可以解决一些,但是有些浅,如果要解决下面这道题
a(10)
function a(a){
console.log(a)
a = 1;
console.log(a)
var a
}
console.log(a)
a = 1;
console.log(a)
var a;
懵了吧。如果只靠那两句话是无法 走天下的。不墨迹了,直接进入主题
这里啰嗦一点,说一下形参和实参,形参就是函数声明后面的那个 () 里面所定义变量,实参就是在调用的时候实际所传的值
function student(name, age){//name、age 属于形参
}
student("蜗牛", "300")//属于实参
预编译:
在函数(function)执行的前一刻的时候,会先做创建一个执行期间上下文,也就是预编译环节,有四个步骤
第一步骤:创建AO对象(Active Object活动对象)
第二步骤:函数体内所有变量声明整体提升,值为undefined(注意:形参也属于变量声明)
第三步骤:使形参、实参值相对应,也就是把实参的值赋给性参
第四步骤:所有函数声明(不是表达式!)整体提升,值为函数体。如果变量和函数名称相同,函数将会覆盖掉变量的值
这个是function函数的预编译环节,其实整个js文件也可以当成一个函数,script标签当成function关键字,那么全局也是有自它自己的预编译环节的。
第一步骤:创建GO对象(Gloabl Object全局对象)
第二步骤:函数体内所有变量声明整体提升,值为undefined
第三步骤:所有函数声明(不是表达式!)整体提升,值为函数体。如果变量和函数名称相同,函数将会覆盖掉变量的值
这个是全局的预编译环节。
函数在执行的前一刻的时候会产生一个执行期上下文,一个执行期上下文所对应的是一个函数在执行期间的环境,每个执行期上下文都是独一无二的,在函数执行结束之后,所对应的执行期上下文就会被销毁,多次调用同一个函数,会产生多个不同的执行期上下文。
上面这一点必须理解记住,不然后面的作用域、作用域链、闭包都会受到影响。
现在回过头来看前面那道题,是不是so easy了?如果有哪些地方不理解 或者 认为我哪些地方写的有问题,请在下面评论。