前言
這幾回面試的是工資略微高的,也就是說不是初級前端了,我發現這些企業技術負責人都不用我再去寫面試題了,多是人家以爲你都面試中高級了,基礎就不考試你了吧。
下邊是面試通過被問到的html
面試題
一、講解一下Function.prototype.bind()的認知?
前端
打開火狐的js文檔你會發現,js內置(類)對象Function,有3個本身的(靜態)原型方法。碰巧的是這3個方法,均與函數內部的上下文this有關。
es6
call、apply、bind都是爲了改變某個函數運行時的上下文而存在的,也就是改變函數內部this的指向,
固然均可以藉助此特性來實現es6以前的繼承,在特定的做用域中調用這些方法,能改變制定函數的做用域,其實是改變函數體內 this 的值 。
改變函數做用域,修改函數運行時的this指針
function People(name){ this.name=name; this.say=function (time,msg) { console.log(time+':'+this.name+'說'+msg) } } var xm=new People('小明'); var xh=new People('小紅'); //用call實現 xm.say.call(xh,2018,'你好啊') //用apply xm.say.apply(xh,[2018,'你好啊']) //用bind xm.say.bind(xh)(2018,'你好啊')
實現繼承web
function People(){ this.say=function () { console.log(this.name+'說:我是人類') } } //利用call實現繼承 function Stu(name) { People.call(this)//會執行一遍People內部代碼,其中執行的上下文對象是這個函數的this,本質上至關於把People內代碼copy到Stu裏邊 this.name=name this.test=function () { console.log('測試') } } stu.say() stu.test()
function People(){ this.say=function () { console.log(this.name+'說:我是人類') } } function Stu(name) { this.name=name this.test=function () { console.log('測試') } // People.bind(this)()//寫法二 } var stu=new Stu('小明'); People.bind(stu)()// 寫法一:函數A.bind(對象a)(arg)這樣的話,函數A內部的調用對象就是對象a了,這樣寫法有點死板,寫法2是動態的 stu.say() stu.test()
二、觀察一下代碼,說出執行結果?面試
setTimeout(function(){ console.log(1) }); new Promise(function(resolve,reject){ resolve() console.log(2); }).then(function(){ console.log(3) }); console.log(4);
//二、四、一、3
上述代碼運行:
同步和異步任務分別進入不一樣的執行"場所"。
同步的進入主線程,異步的進入Event Table並註冊函數。
當指定的事情完成時,Event Table會將這個函數移入Event Queue。
主線程內的任務執行完畢爲空,會去Event Queue(隊列)讀取對應的函數,進入主線程執行。
上述過程會不斷重複,也就是常說的Event Loop(循環)。
任務隊列又分爲宏任務隊列和微任務隊列。宏任務隊列能夠有多個,微任務隊列只有一個。
從執行步驟來看,咱們發現微任務,受到了特殊待遇:js異步機制,就是遇到宏任務先執行,完成後再執行微任務chrome
宏任務:setTimeout,setInterval。
微任務:Promise,process.nextTickjson
三、說一下你對http的認知
http協議 是網絡協議中五層中的最後一層‘應用層’的具體協議。
HTTP是超文本傳輸協議的簡寫,它是TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程。客戶端連上web服務器後,若想得到web服務器中的某個web資源,需遵照必定的通信格式,HTTP協議用於定義客戶端與web服務器通迅的格式。
由於chrome和firefox都作了優化,因此這個格式在某個瀏覽器 顯示都不太同樣,fire還好一些,提供了原始數據展現。
通常狀況下 瀏覽器喜歡把請求行和響應行融合爲一體,chrome叫作General,火狐以下便可看到
瀏覽器
HTTP請求報文:由3部分組成(請求行+請求頭+請求體)
請求行:
①是請求方法,GET和POST是最多見的HTTP方法,除此之外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②爲請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL。
③是協議名稱及版本號。緩存
請求頭:
是HTTP的報文頭,簡稱頭部(request的header),報文頭包含若干個屬性,格式爲「屬性名:屬性值」,服務端據此獲取客戶端的信息
請求頭可能會有以下參數服務器
// Accept(好比Accept:text/plain) // 請求報文可經過一個「Accept」報文頭屬性告訴服務端 客戶端接受什麼類型的響應。 // 以下報文頭至關於告訴服務端,俺客戶端可以接受的響應類型僅爲純文本數據啊,你丫別發其它什麼圖片啊,視頻啊過來,那樣我會歇菜的~~~ // Accept屬性的值能夠爲一個或多個MIME類型的值(描述消息內容類型的因特網標準, 消息能包含文本、圖像、音頻、視頻以及其餘應用程序專用的數據) // cookie(好比:Cookie:userName=xm) // 客戶端的Cookie就是經過這個報文頭屬性傳給服務端的哦! // Referer(好比Referer: https://y.qq.com/) // 表示這個請求是從哪一個URL過來的,假如你經過google搜索出一個商家的廣告頁面,你對這個廣告頁面感興趣,鼠標一點發送一個請求報文到商家的網站,這個請求報文的Referer報文頭屬性值就是http://www.google.com。 // Cache-Control(好比cache-control: max-age=600) // 對緩存進行控制,如一個請求但願響應返回的內容在客戶端要被緩存一年,或不但願被緩存就能夠經過這個報文頭達到目的。 // Content-Type給服務器的數據類型 // 一、application/json // 發送給服務器的數據,會對數據進行JSON序列化 // 二、application/x-www-form-urlencoded // 發送給服務器的數據,會將數據轉化成query string,在瀏覽器network裏參數會放到Form Data裏
請求體:
也叫報文體,它將一個頁面表單中的組件值經過param1=value1¶m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體能夠傳遞請求參數,請求URL也能夠經過相似於「/chapter15/user.html? param1=value1¶m2=value2」的方式傳遞請求參數。
HTTP的響應報文也由三部分組成(響應行+響應頭+響應體)
響應行:
①報文協議及版本;
②狀態碼及狀態描述;
響應頭:
響應報文頭,也是由多個屬性組成;
響應體:
響應報文體,即咱們真正要的「乾貨」
參考:https://blog.csdn.net/heyue_99/article/details/74689057