前端面試之Js預編譯

2020-08-29 web前端工廠

js預編譯是前端平時面試筆試題的必考題,預編譯能夠很大程度的考察面試者的js基礎,所以也是現如今各大公司的熱門考點。

javascript預編譯

面對這種考點時,有些人總喜歡刷題,想通過題海戰術來解決問題。但是這種做法是非常費時間的,只有掌握了真正的方法,才能事半功倍。


那麼什麼是預編譯呢?其實預編譯就是js代碼執行過程中的一個階段,那麼js代碼執行的過程是怎麼樣的呢?

js代碼執行步驟主要有三個階段:

  1. 首先是檢查代碼通篇的語法錯誤
  2. 其次就是js的預編譯過程了
  3. 最後就是代碼的實際執行過程(解釋一行,執行一行)

下面簡單的看一段代碼(預熱一下):

(a) test() function test() { console.log(1) // 1 } (b) console.log(a); // undefined var a ; 函數申明整體提升,變量只有申明提升,賦值不提升 (c) console.log(a) // function a(a){} function a(a){} var a = 1 (d) var a = 1 b = 2 console.log(window.b) // a = window.a // b = window.b

上面一共列出了四個例子,每個例子針對不同的情況:

  • (a)主要考察了函數整體提升;
  • (b)主要考察了變量申明提升;
  • (c)把a和b融合在一起了,進行聯合考察;
  • (d)就比較常見了,全局變量掛載window。

上面這幾種情況是非常簡單的題型,如果沒有解題方法,遇到這種題應該還能夠解決,一旦遇到比較複雜的題就得碰運氣了。

類似如下:

(a) function test(){ var a = b = 1 // 1.先聲明 var a // 2.1賦值給b // 3.b的值賦值給a } console.log(a) // error console.log(window.a) // undefined console.log(b) // 1 console.log(window.b) // 1 (b) function test(a) { console.log(a) // function a() {} var a = 1 console.log(a) // 1 function a() {} console.log(a) // 1 var b = function () {} console.log(b) // function(){} function d() {} } test(2)

這兩道題就比剛才的題複雜多了,但是如果沒有解題方法,還是很難全部做對的。答案已經給出來了,可以先對照著看一下,看自己能做對多少。

怎麼做呢?

解題方法來了(敲黑板),預編譯根據作用域劃分,主要有兩種環境,第一種是函數預編預,另外一種就是全局上下文了。那麼這兩種情況應該怎麼辦呢?

函數預編譯:AO activation object (活躍對象,函數上下文)

function test(a) { console.log(a) // function a() {} var a = 1 console.log(a) // 1 function a() {} console.log(a) // 1 var b = function () {} console.log(b) // function(){} function d() {} } test(2) 執行過程 AO = { } <-預編譯過程-> 第一步:尋找形參和變量申明 AO = { a: undefined, b: undefined } 第二步:實參賦值給形參 AO = { a: undefined -> 2, b: undefined } 第三步:尋找函數體的申明,並賦值 AO = { a: undefined -> 2 -> function a() {}, b: undefined, d: function d() {} } <-代碼執行過程-> 第四步:執行函數體第一句 // console.log(a):function a(){} 第五步:執行函數體第二局 //a = 1 AO = { a: undefined -> 2 -> function a() {} -> 1, b: undefined, d: function d() {} } ....

以上流程圖可以清晰的看明白整個解題的思路,遇到函數域的預編譯題時就可以按照這個步驟去解題,百試不爽。

全局預編譯:GO global object 全局上下文

(a) var a = 1 function a() { console.log(2) } console.log(a) // 1 GO = { a: undefined -> function a(){} -> 1 } 其實GO就是window,即GO === window (b) console.log(a, b) // function a(){} undefined function a() {} var b = function () {} GO = { b: undefined a: function a(){} }

全局編譯其實類似函數域編譯,只是多了一個global,一般的題型中,全局上下文和函數域的預編譯都是聯合在一起考察。但是總的思路就是:

  1. 找變量
  2. 找函數申明
  3. 執行

一步一步的走向成功

掌握了這個思路,遇到預編譯的題就再也不怕了,希望分享的能夠幫助到大家,如果大家有不同的見解,可以留言探討。

作者的文章有沒有幫助到你? 單選
0
0%
非常有幫助
0
0%
一般
0
0%
沒有幫助

相關焦點

  • 2020Web前端高頻面試題全解析-開課吧Web前端
    說一下圖片的懶加載和預加載?預加載:提前加載圖片,當用戶需要查看時可直接從本地緩存中渲染。懶加載:懶加載的主要目的是作為伺服器前端的優化,減少請求數或延遲請求數。兩種技術的本質:兩者的行為是相反的,一個是提前加載,一個是遲緩甚至不加載。 懶加載對伺服器前端有一定的緩解壓力作用,預加載則會增加伺服器前端壓力。如何理解前端模塊化?
  • Web前端面試問什麼?2020Web前端常見面試題及答案-開課吧Web前端
    想成功就業Web前端工程師,想要高薪就業,不只要掌握Web技能,還需懂得面試技巧和面試時常見面試題做好面試時的準備。小科今日整理了五道前端常見面試題及答案解析,希望對您Web前端學習或面試提供參考。Web前端面試題及答案2020,開課吧Web前端Web前端面試題1:vue有什麼生命周期?
  • Web前端面試問什麼?2020Web前端常見面試題及答案
    想成功就業Web前端工程師,想要高薪就業,不只要掌握Web技能,還需懂得面試技巧和面試時常見面試題做好面試時的準備。小科今日整理了五道前端常見面試題及答案解析,希望對您Web前端學習或面試提供參考。開課吧Web前端面試題及答案Web前端面試題1:vue
  • 前端面試(原生js篇) - DOM
    一般小公司的面試環節,比較關心框架的熟練程度,以及獨立開發組件的能力但大廠通常有五輪以上的面試,而且對 js 基礎語法很是看重於是我總結了一些關於 js 基礎的面試對話,有的當時沒答上來,就在總結的時候就加了點料忽然覺得又該讀一遍犀牛書了...一、面試問:你知道 js 是由哪三部分構成的麼?
  • 2020Web前端開發工程師常見面試題匯總,提高面試成功機率!
    Web前端面試題01運行在客戶端瀏覽器上;不用預編譯,直接解析執行代碼;是弱類型語言,較為靈活;與作業系統無關,跨平臺的語言;腳本語言、解釋性語言基本數據類型:undefined、null、number、boolean、string、symbol04js跨域的原理是什麼
  • 2020Web前端面試常見基礎題及答案解析-開課吧
    Web前端面試題Web前端面試題:一個tcp連結能發幾個http請求?Web前端面試題:小程序和H5什麼區別?H5 下我們所有資源通常都會打到一個 bundle.js 文件裡(不考慮分包加載),而小程序編譯後的結果會有兩個bundle,index.js封裝的是小程序項目的 view 層,以及 index.worker.js 封裝的是項目的業務邏輯,在運行時,會有兩條線程來分別處理這兩個bundle,一個是主渲染線程,它負責加載並渲染index.js 裡的內容,另外一個是 Service Worker線 程,
  • 前端面試時,被問到項目中的難點有哪些?
    在每個前端求職者的面試過程中,一定都有過被面試官問到項目中的難點,而答不上來的情況。為了讓大家在前端面試前準備得更加充足,小編準備了一些易被忽視且難度較高的前端面試題,希望可以幫助大家更加順利完成求職,找到自己滿意的工作。
  • 等前端面試題
    Web前端開發面試題,前端面體及答案2020緩存: 行動網路條件差,為了用戶體驗,必須要做資源緩存和預加載。通信: 即HTML5和Native之間的通信。利用系統提供的橋接API可以實現,不過在應用上還 有著一些坑點和安全問題。
  • 2020Web前端常見面試題最新前端面試題及答案-前端教程
    src是指向外部資源的位置,指向的內容將會嵌入到文檔中當前標籤所在位置;在請求src資源時會將其指向的資源下載並應用到文檔內,例如js腳本,img圖片和frame等元素。當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,類似於將所指向資源嵌入當前標籤內。這也是為什麼將js腳本放在底部而不是頭部。
  • 前端開發之走進Vue.js
    推廣 | 令人窒息的獎品等你―2016最權威的全球開發者調研 Vue.js作為目前最熱門最具前景的前端框架之一,其提供了一種幫助我們快速構建並開發前端項目的新的思維模式。
  • 前端工程化以及如何通過Node.js中babel來編譯es6模塊化代碼
    文件都是一個獨立的模塊.導入模塊成員使用 import 關鍵字暴露模塊成員使用 export 關鍵字之後就形成了前端工程化下面在:Node.js中通過babel體驗ES6模塊化1.首先電腦要安裝Node.js 環境必須v10以上的版本自帶npm包管理工具不需要再單獨安裝npm2.創建工程項目文件夾名稱不要使用中文 不能使用 babel 因為會和第三方模塊
  • 2020,前端面試都問些什麼,我們來看看
    前端面試如何讓面試官對你刮目相看2020年註定是不平凡的一年,找工作的競爭壓力可想而知,如何從眾多面試者中脫穎而出呢,總結了一波前端常見面試題,希望對大家有所幫助!重點:函數內部同樣適用於js預解析。跨域解決之Proxy現在項目一般都使用腳手架,即使用webpack,那可以使用webpack自帶的proxy特性來處理跨域,下面我們來配置一個簡單的webpack項目,如下1.創建配置文件webpack.config.js
  • 2020最新Web前端經典面試題試題及答案(持續更新)-開課吧
    Web前端面試題Web前端面試題:說說你對webpack的看法解析:webpack是一個模塊打包工具,可以使用webpack管理你的模塊依賴,並編譯輸出模塊們所需要的靜態文件。能很好的管理、打包web開發中所用到的HTML、js、css以及各種靜態文件(圖片、字體等),讓開發過程更加高效。對於不同類型的資源,webpack有對應的模塊加載器。webpack模塊打包器會分析模塊間的依賴關係,最後生成了優化且合併後的靜態資源。
  • 2020最新Web前端經典面試題試題及答案(持續更新)
    Web前端面試題Web前端面試題:說說你對webpack的看法解析:webpack是一個模塊打包工具,可以使用webpack管理你的模塊依賴,並編譯輸出模塊們所需要的靜態文件。能很好的管理、打包web開發中所用到的HTML、js、css以及各種靜態文件(圖片、字體等),讓開發過程更加高效。對於不同類型的資源,webpack有對應的模塊加載器。webpack模塊打包器會分析模塊間的依賴關係,最後生成了優化且合併後的靜態資源。
  • Scala.js 0.6.29 發布,將 Scala 編譯成 js 的編譯器
    Scala.js 是一個將 Scala 語言編譯成 JavaScript 的工具,旨在構建更健壯的前端 web 應用程式。
  • 2020Web前端高頻面試題及答案解析
    說一下圖片的懶加載和預加載?預加載:提前加載圖片,當用戶需要查看時可直接從本地緩存中渲染。懶加載:懶加載的主要目的是作為伺服器前端的優化,減少請求數或延遲請求數。懶加載對伺服器前端有一定的緩解壓力作用,預加載則會增加伺服器前端壓力。如何理解前端模塊化?
  • 2020Web前端面試題匯總-開課吧
    Web前端面試題說說前端中的事件流它的功能是將對應的字符串解析成js並執行,應該避免使用js,因為非常消耗性能(2次,一次解析成js,一次執行)。js如何判斷類型?判斷方法:typeof(),instanceof,Object.prototype.toString.call()等。
  • 前端開發之認識Vue.js
    1 Vue.js是什麼單獨來講,Vue.js被定義成一個用來開發Web界面的前端庫所謂響應式編程,即為保持狀態和視圖的同步,這個在大多數前端MV*(MVC/MVVM/MVW)框架,不管是早期的backbone.js
  • 程序猿大表哥前端面試題全集之每日兩題-10,歡迎討論
    面試題會涉及阿里 京東 字節跳動 攜程 美團 餓了麼 等個大廠的前端面試題,題目出處我就不一一具體標註。題1:說說冒泡排序和選擇排序原理?並手寫出js代碼?題2:為什麼js是單線程?怎麼解決?歡迎各位同行、大佬一起探討。
  • 等前端面試題
    Web前端開發面試題,前端面體及答案2020移動布局自適應屏幕的幾種方式?(1) 響應式布局 (2) 100%布局(彈性布局) (3) 等比縮放布局(rem)如何防止XSS攻擊?(1) 將前端輸出數據都進行轉義 (2) 將輸出的字符串中的\反斜槓進行轉義 (3) 從url中獲取的信息,防治方法是由後端獲取,在前端轉義後再行輸出 (4) 使用cookie的HttpOnly屬性,保護好cookie混合開發的注意點增強WebView : 原生WebView基本是PC平臺瀏覽器內核的移植,但對於移動場景並不完全適合,各種硬體API得不到HTML5