Hi~我是Tom,今天咱們來聊聊面試官很喜歡問,可是平時開發又沒什麼卵用的JSONP請求吧😫javascript
JSONP是JSON with Padding的略稱,JSONP爲民間提出的一種跨域解決方案,經過客戶端的script標籤發出的請求方式。html
那請求何須作得如此麻煩,直接使用ajax作請求豈不美哉,這裏便要涉及到一個同源和跨域的問題,往下。java
同源策略,它是由Netscape網景公司提出的一個著名的安全策略。
複製代碼
如今全部支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,端口相同。面試
而全部非同源的請求(即 域名,協議,端口 其中一種或多種不相同),都會被做爲跨域請求,瀏覽器會將其非同源的響應數據丟棄。ajax
這裏能夠理解爲是瀏覽器在搞事情,服務端確確實實有返回數據,瀏覽器接收到返回的數據,發現咱們請求的是一個非同源的數據,瀏覽器再將其響應報文丟棄掉。json
而經過一些標籤發出的請求則不會被進行同源檢查,好比script標籤,img標籤等等,本文講述JSONP即是經過script標籤作的請求。後端
在發請求先,準備一個全局的接收函數跨域
window.myCallback = (res)=>{ //聲明一個全局函數 'callback',用於接收響應數據
console.log(res)
}
複製代碼
在html建立script標籤,發出請求瀏覽器
<html>
....
<script> window.myCallback = (res)=>{ //這裏爲上一步定義的全局函數 console.log(res) } </script>
<script url="xxx?callback=myCallback"> //script標籤的請求必須在寫在定義全局函數以後 //這裏需將全局函數的函數名做爲參數callback的value傳遞 //這裏callback這個鍵名是先後端約定好的 </script>
</body>
</html>
複製代碼
服務端接收到請求,將以下數據相應回安全
myCallback({ //一個函數的調用,將數據做爲參數傳遞進去,再將整個函數的調用返回給客戶端
name:'ahreal',
age:18
})
複製代碼
客戶端接收到服務端的相應,至關於:
<html>
....
<script> window.myCallback = (res)=>{ //這裏爲上一步定義的全局函數 console.log(res) } </script>
<script> //將接收到的數據做爲script標籤裏面的內容展開執行 myCallback({ name:'ahreal', age:18 }) </script>
</body>
</html>
複製代碼
控制檯輸出
到這裏,JSONP的相關概念,已經闡述完畢,面試官問你JSONP請求的時候,兩步走,1. JSONP是什麼 2. JSONP怎麼作。
面試官:說說JSONP請求吧。
我:JSONP請求首先是爲了解決跨域問題而存在的一種民間解決方案balabala...
瀏覽器存在同源安全機制balabala...
經過標籤的形式發請求balabala...
須要和後端同窗進行約束balabala...
只能使用get請求balabala...
複製代碼
答道這裏JSONP這道題你已經回答了80分了,若是這時候你可以蹦出一句:
emm...我曾經使用原生js封裝過一個jsonp的插件,balabala...
複製代碼
那麼你將會是100分的回答,那不少同窗可能會問,
但是我沒封裝過JSONP的插件啊喂!
複製代碼
彆着急,我爲你準備了另一篇封裝JSONP請求插件的博客,裏面完整的闡述了思路和代碼的實現。我很是建議你好好讀一下,這將對你學習JSONP的請求有巨大的幫助。
End