一、執行背景關系是什么?
執行背景關系用大白話來說也就是代碼在被決議以前或者在執行時候所處的環境
二、執行背景關系分類
,
執行背景關系分為全域執行背景關系,函式執行背景關系, Eval(不常用,不做過多解釋):
1.全域執行背景關系:在執行全域代碼前講window確定為全域執行背景關系
執行代碼前主要進行了如下一系列操作
var定義的全域變數=>undefined 添加為window的屬性
function定義的全域函式,添加為winow的方法
this指向window
然后開始執行全域代碼
2.函式執行背景關系:在呼叫函式,準備執行函式體之前,創建對應的函式執行背景關系
首先要知道,每次呼叫函式都要創建函式執行背景關系
呼叫函式前主要進行了如下一系列操作
形參變數->賦值->添加為函式的執行背景關系屬性
arguments->賦值(實參串列),添加為函式執行背景關系的屬性
var定義的區域變數->undefined,添加為函式執行背景關系的屬性
function宣告的函式,添加為執行背景關系的方法
this指向呼叫函式的物件
然后開始執行函式體代碼
特別強調
全域執行背景關系指的就是window物件
函式執行背景關系指的也是一個物件(不要糾結這個物件是誰,只要知道是個物件來掛區域變數,區域方法,agruments就可以了)
案列
在前幾天和同事交流這個技術點的時候,發現他理解的不太對,下面我用一個案列來演示

大家都習慣叫這個為變數提升,然而對變數提升理解有誤,大家覺得var a;這行代碼跑到了最上面,因此列印出來是undefined,變數提升其實也是執行背景關系的一部分內容,正確理解應該是當訪問a時候要去全域執行背景關系(window)上看看有沒有a這個屬性,
我再用一個案列來展示函式執行背景關系

類似全域執行背景關系,錯誤的理解是變數提升到函式體內部第一行,正確的理解是在函式內部訪問a時候要現在函式執行背景關系這個物件上找有沒有a屬性,因為之前賦值是undefined,所以列印出來是undefined
總結
以上就是我對執行背景關系的簡單總結,沒有講的特別深,這個足夠應對常見的面試題了,希望對各位同學有所幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/277048.html
標籤:其他
