一段代码看出JS的的解析到执行的顺序规则
代码
function bar(a, b) {
b = 3;
var b;
function b(){}
console.log(a); // 打印出:10
console.log(b); // 打印出:3
return function a(){};
}
bar(10);
执行顺序
函数外面的时候,代码拆成前后两部分来看:
第 1 部分:(申明)
- 1、申明了一个
bar=undefined
的函数变量,用代码可以看成:(VO
是执行上下文,可以看成是this
)
VO = {bar:undefined}
第 2 部分:(执行)
- 2、执行
bar(10)
这里由于是函数,存在独立作用域,只要存在作用域就先解析,所以这里又可以拆成两部分来看:
第 2.1 部分:(申明)
- 先声明
a=10
,b=undefined
两个形参变量,再申明函数变量b=function b(){}
,由于上下文VO1
中已经存在b
了,所以会覆盖掉形参b
的申明,然后再申明var
变量b=undefined
,并覆盖已经存在VO1
中函数变量b
,用代码表示:
VO1 = {a:10,b:undefined}
注意:这里需要注意的是函数表达式return function a(){}
并不会提前申明,函数表达式
和函数申明
的异同是,除了标准的函数申明
:function a(){}
,其他的都是函数表达式
,如:var a = function (){}
、(function a(){})
...等。
注意:申明的权重:argument(函数的形参申明) > function声明 > var声明 (也就之前提高的变量提升Hoisting)
第 2.2 部分:(执行)
- 先执行
b=3
,再执行两个console.log,再执行:函数表达式申明,及执行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。