摘要:變量提升變量的聲明寫在可以在使用變量之后函數提升函數可以先調用,后聲明上面先解釋了下我理解的這兩個概念的定義。參考前端基礎進階三變量對象詳解關于變量提升的理解
變量提升:變量的聲明寫在可以在使用變量之后;
函數提升:函數可以先調用,后聲明;
上面先解釋了下我理解的這兩個概念的定義。要真正理解它們,最好從變量對象的角度出發。引出變量對象的概念,要先理解執行上下文,也就是當控制器執行到可執行代碼的時候,就會生成一個執行上下文,也就是代碼的執行環境,會產生一個作用域。這個執行上下文的生命周期有兩個階段:創建階段 和 代碼執行階段
創建階段就會創建變量對象,創建的過程分三步:
1.建立arguments對象。檢查當前上下文中的參數,建立該對象下的屬性與屬性值
2.先檢查有沒有函數聲明(利用function關鍵字聲明的函數,在變量對象中用函數名作為屬性名,屬性值是函數內存地址
的引用。如果函數名的引用已經存在,那么會被新的引用覆蓋)
3.再檢查變量聲明,每找到一個變量聲明,就在變量對象里用變量名作為屬性名,屬性值是undefined。如果變量名已經存在,直接跳過,目的是防止把同名的函數被修改成undefined
執行階段會將變量對象轉換為活動對象:
創建完成之后,就會開始執行代碼,這個時候,會完成變量賦值,函數引用,以及執行其他代碼。
(在變量對象創建過程中,其中的屬性不可訪問。只有在執行階段轉為活動對象后,才可以訪問其中的內容)
先來一個簡單的例子:
function foo(){ a = 2; function a(){ console.log("函數") } console.log(a); //2 var a; }; foo();
這個例子中,當控制器遇到這段代碼時候,會形成一個執行上下文。隨后進入到執行上下文的第一個生命周期:創建階段,此時,執行創建變量對象的三個步驟。
由于沒有參數。直接進入第二步。
首先檢查上下文中有沒有function關鍵字聲明的函數,以a為屬性名,函數的引用為屬性值,添加到變量對象中。
再檢查函數聲明,發現了變量名a,但是,以a為屬性名的屬性值已經存在,所以跳過。
接下來進入第二個生命周期:代碼執行
a被賦值為2,函數a未被調用。打印a等于2
函數提升也是一個道理,由于變量對象創建過程中會先檢查function關鍵字聲明的函數,以該函數的函數名為屬性,值為函數地址的引用,添加進變量對象中。
參考:前端基礎進階(三):變量對象詳解 關于JavaScript變量提升的理解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107039.html
摘要:函數面試考點比較密集參考阮一峰函數我的博客關于作用域變量提升函數提升的個人理解筆記函數的五種聲明方式具名函數聲明一個變量七種數據類型聲明一個函數是個特例不寫自動加上關于返回會在傳入的參數里首先調用方法但是當打印到控制臺的時候沒有寫雙引號是瀏 JavaScript函數 面試考點比較密集參考阮一峰JavaScript函數我的博客:關于作用域,變量提升,函數提升的個人理解筆記 1.函數的五種...
摘要:函數使用函數的使用主要有兩種閉包閉包的本質是對共享變量的操作,典型運用是觀察者模式備忘錄模式普通封裝,復用。參考阿里博客你可能不知道的事基礎篇總結要寫好一個項目需要兼容,性能,安全等。 一次阿里面試后對函數本質的理解 寫在前面 環境:阿里的在線編程系統允許面試官在線考察面試者的編程能力. 考點:編程和理論. 編程:分為技術自驅力、異步操作、編程風格(顆粒小)、變量作用域、DOM操作...
摘要:函數使用函數的使用主要有兩種閉包閉包的本質是對共享變量的操作,典型運用是觀察者模式備忘錄模式普通封裝,復用。參考阿里博客你可能不知道的事基礎篇總結要寫好一個項目需要兼容,性能,安全等。 一次阿里面試后對函數本質的理解 寫在前面 環境:阿里的在線編程系統允許面試官在線考察面試者的編程能力. 考點:編程和理論. 編程:分為技術自驅力、異步操作、編程風格(顆粒小)、變量作用域、DOM操作...
摘要:函數使用函數的使用主要有兩種閉包閉包的本質是對共享變量的操作,典型運用是觀察者模式備忘錄模式普通封裝,復用。參考阿里博客你可能不知道的事基礎篇總結要寫好一個項目需要兼容,性能,安全等。 一次阿里面試后對函數本質的理解 寫在前面 環境:阿里的在線編程系統允許面試官在線考察面試者的編程能力. 考點:編程和理論. 編程:分為技術自驅力、異步操作、編程風格(顆粒小)、變量作用域、DOM操作...
摘要:關于兩個專業術語的討論起自對你不知道的一書的閱讀學習。遇到,編譯器會詢問作用域是否已經有一個該名稱的變量存在于同一個作用域的集合中。摘錄來自你不知道的。 JS 編譯之 LHS RHS 一、前言 最近和朋友聊技術的時候,聊到 LHS RHS,我竟然沒聽說過 沒聽說過。。。 于是成功引起了我的好奇心。 關于兩個專業術語的討論起自對《你不知道的JavaScript》一書的閱讀學習。 二、編譯...
閱讀 2475·2021-11-24 09:39
閱讀 3406·2021-11-15 11:37
閱讀 2251·2021-10-08 10:04
閱讀 3965·2021-09-09 11:54
閱讀 1883·2021-08-18 10:24
閱讀 1034·2019-08-30 11:02
閱讀 1793·2019-08-29 18:45
閱讀 1651·2019-08-29 16:33