一段代碼看出JS的的解析到執行的順序規則

一段代碼看出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 部分:(申明)

  • 一、申明瞭一個bar=undefined的函數變量,用代碼能夠當作:(VO是執行上下文,能夠當作是this

函數

VO = {bar:undefined}

第 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)this

第 2.2 部分:(執行)
  • 先執行b=3,再執行兩個console.log,再執行:函數表達式申明,及執行。
相關文章
相關標籤/搜索