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,再執行:函數表達式申明,及執行。