當違背同源策略時就會發生跨域問題前端
常見的解決跨域問題的方法有jsonp , cors , 服務器代理。。。面試
corsjson
cors是一種標準,現已支持絕大多數的瀏覽器,當瀏覽器檢測到你發送的是跨域請求時會進行一個簡單的處理(給請求頭加上 Origin (協議 + 域名 + 端口))後端
cors服務端會將這個字段做爲跨域標誌,接受到後會對origin進行判斷是否爲容許源,驗證經過服務端會給請求頭加上access-Control-Allow-Origin、Access-Control-Allow-Credentials等字段。跨域
cors裏面有一個簡單請求與非簡單請求的概念,簡單請求的條件以下:瀏覽器
(1) 請求方法是如下三種方法之一:服務器 HEAD GET POST閉包 |
|
2)HTTP的頭信息不超出如下幾種字段:app Accept Accept-Language cors Content-Language Last-Event-ID Content-Type: application/x-www-form-urlencoded、 multipart/form-data、text/plain |
簡單請求如上所說正常進行,非簡單請求會在發送前先發送一個options類型的預檢請求,驗證經過以後纔會執行真正的請求;
關於jsonp的原理分析
在前端裏使用jsonp須要進行以下設置 // 動態建立script標籤發出去的請求是異步請求 // 服務器響應的內容是【函數調用】 // 建立script標籤 var script = document.createElement('script'); // 設置回調函數(由於是異步操做,因此該回調函數能夠放在任何位置) // 這裏的getData函數實際是有服務器的響應內容(內容就是js代碼-函數調用 // getData(data)調用) function getData(data){ //數據請求回來會被觸發的函數 console.log(data); } // 設置script 的src屬性,設置請求地址 script.src = 'http://localhost:3000?callback=getData'; //假設get請求,url裏保存地址 // 讓script生效 document.body.appendChild(script);
關於callback函數能夠自定義,回調函數的命名需與後端保持一致
// 建立script標籤 var script = document.createElement('script'); // 設置回調函數 function hello(data){ //數據請求回來會被觸發的函數 console.log(data); } // 設置script 的src屬性,設置請求地址 //script.src = 'http://localhost:3000?callback=getData'; //假設get請求,url裏保存地址 script.src = 'http://localhost:3000?[與後端約定的命名]hello=getData'; // 讓script生效 document.body.appendChild(script); // hello就是回調函數 // 這就是jsonp的本質:動態建立script標籤,而後經過它src屬性發送跨域請求,而後服務器響應數據格式爲【函數調用(hello(實參))】,因此在發送請求前必須先聲明一個函數,
// 而且函數的名字與參數中傳遞的名字要一致,
// 這裏聲明的函數是由服務器響應的內容(實際就是一段js代碼-函數調用)來調用
1,密閉的容器,相似於set,map容器,存儲數據的容器
2,閉包是一個對象,存放數據的格式:key:value
1.函數嵌套
2.內部函數引用外部函數的局部變量
延長外部函數局部變量的生命週期
容易形成內存的泄露
1,合理使用閉包
2,用完閉包要及時清除(銷燬)
簡單閉包面試題:
(1)說出打印結果
function fun (){ var count = 1; return function(){ count++; console.log(count); } } var fun2 = fun(); fun2(); //2 fun2(); //3
(2)說出打印狀況
function fun(n,o){ console.log(o); return{ fun:function(m){ return fun(m,n) } } } var a = fun(0) a.fun(1) a.fun(2) a.fun(3) //undefined,0,0,0 var b = fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2,3 var c = fun(0).fun(1) c.fun(2) c.fun(3) //undefined,0,1,1