函數(shù)出了問題?
先拋出問題:js引擎在拿到這么一段代碼,會做些什么?function a(x){console.log(x)}a(22)每次執(zhí)行一個函數(shù)時都會創(chuàng)建一個執(zhí)行上下文,比如以下幾種情況都會:全局情況下執(zhí)行一個函數(shù)函數(shù)中調(diào)用一個函數(shù)(調(diào)用的函數(shù)可以是他本身)Eval關鍵詞執(zhí)行的函數(shù)每次函數(shù)執(zhí)行都先去創(chuàng)建執(zhí)行上下文,然后再去激活執(zhí)行代碼。其中全局情況執(zhí)行函數(shù)會創(chuàng)建全局上下文,每個函數(shù)創(chuàng)建會創(chuàng)建各自的函數(shù)上下文,每次調(diào)用函數(shù)都會在棧頂創(chuàng)建上下文,然后 js引擎再執(zhí)行函數(shù)內(nèi)部邏輯,只從棧頂取變量數(shù)據(jù)創(chuàng)建執(zhí)行上下文就是完成作用域鏈、參數(shù)對象,內(nèi)部變量函數(shù)的初始化,以及this變量的獲取。執(zhí)行上下文包括什么呢?作用域鏈。包括函數(shù)本身及所有父執(zhí)行上下文,這也解釋了為什么函數(shù)內(nèi)部可以訪問外部的變量,但外部不能內(nèi)部的變量參數(shù) argument對象,內(nèi)部變量、函數(shù)的聲明。初始化參數(shù)對象arguments,解析函數(shù)內(nèi)部,對變量的聲明進行初始化(但不執(zhí)行),函數(shù)的聲明只是創(chuàng)建一個函數(shù)對象。this 變量調(diào)用棧所有執(zhí)行上下文構(gòu)成了一個調(diào)用棧,所以全局調(diào)用棧永遠在棧底。調(diào)用函數(shù)時,將執(zhí)行上下文入棧,函數(shù)執(zhí)行完成后則出棧。代碼的執(zhí)行這個時候,上下文已經(jīng)入棧,執(zhí)行上下文已經(jīng)初始化了作用域鏈,內(nèi)部變量,this等,然后就開始一步步的執(zhí)行。查找變量的時候,先找當時函數(shù)的內(nèi)部變量,找不到再一層層的去作用域鏈上找,一直找到全局作用域,如果仍舊沒找到,則報錯,變量未定義。本篇文章介紹了執(zhí)行上下文和調(diào)用棧,對于我們分析代碼執(zhí)行過程中變量變化有幫助,也讓我們寫出性能更好的代碼。