function bar(a, b) { b = 3; var b; function b(){} console.log(a); // 打印出:10 console.log(b); // 打印出:3 return function a(){}; } bar(10);
bar=undefined
的函数变量,用代码能够当作:(VO
是执行上下文,能够当作是this
)函数
VO = {bar:undefined}
bar(10)
这里因为是函数,存在独立做用域,只要存在做用域就先解析,因此这里又能够拆成两部分来看: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)this
b=3
,再执行两个console.log,再执行:函数表达式申明,及执行。