1. JavaScript原型,原型鏈 ? 有什么特點撇他?
- Js所有的函數(shù)都有一個prototype屬性逛裤,這個屬性引用了一個對象,即原型對象启涯,也簡稱原型
- 原型鏈:由于原型對象本身也是對象贬堵,而每個javascript對象都有一個原型對象恃轩,每個對象都有一個隱藏的proto屬性,原型對象也有自己的原型黎做,而它自己的原型對象又可以有自己的原型叉跛,這樣就組成了一條鏈,這個就是原型鏈蒸殿。在訪問對象的屬性時筷厘,如果在對象本身中沒有找到,則會去原型鏈中查找宏所,如果找到酥艳,直接返回值,如果整個鏈都遍歷且沒有找到屬性楣铁,則返回undefined玖雁。原型鏈一般實現(xiàn)為一個鏈表,這樣就可以按照一定的順序來查找盖腕。
- 例子
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
2. 什么是閉包(closure)赫冬,為什么要用它?
閉包定義過于晦澀
我理解的是 外部函數(shù)持有內(nèi)部變量溃列,且不會被銷毀劲厌,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。
作用也就是利用他的特點听隐,可以讀取函數(shù)內(nèi)部的變量补鼻,讓這些變量的值始終保持在內(nèi)存中。
3. 如何解決跨域問題?
跨域:從一個頁面去請求讀或者寫另一個頁面的資源雅任,突破同源策略的限制风范。
跨域的幾種方式:
- 主域名相同,子域不同的沪么,如:child.a.html和a.html可通過設(shè)置document.domain = a.html達到降域的目的硼婿,實現(xiàn)跨域訪問。問題:
1禽车、安全性寇漫,當一個站點(b.a.com)被攻擊后,另一個站點(c.a.com)會引起安全漏洞殉摔。
2州胳、如果一個頁面中引入多個iframe,要想能夠操作所有iframe逸月,必須都得設(shè)置相同domain栓撞。 - JSONP(json with padding),只支持get請求,無法判斷請求是否失斖胗病(不會返回各種HTTP狀態(tài)碼)瓤湘,安全性不高捌归,假如提供jsonp的服務(wù)存在頁面注入漏洞,那么所有調(diào)用這個jsonp的網(wǎng)站都會存在漏洞岭粤。但它的兼容性很好,在許多老版本瀏覽器上都可以運行特笋,不想XMLHttpRequest對象實現(xiàn)的Ajax請求那樣收到同源策略的限制剃浇。
- CORS (cross-origin-resource-sharing)
CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)猎物。它允許瀏覽器向跨源服務(wù)器虎囚,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制蔫磨。CORS需要瀏覽器和服務(wù)器同時支持淘讥。目前,所有瀏覽器都支持該功能堤如,IE瀏覽器不能低于IE10蒲列。整個CORS通信過程,都是瀏覽器自動完成搀罢,不需要用戶參與蝗岖。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別榔至,代碼完全一樣抵赢。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息唧取,有時還會多出一次附加的請求铅鲤,但用戶不會有感覺。因此枫弟,實現(xiàn)CORS通信的關(guān)鍵是服務(wù)器邢享。只要服務(wù)器實現(xiàn)了CORS接口,就可以跨源通信媒区。CORS與JSONP的使用目的相同驼仪,但是比JSONP更強大。JSONP只支持GET請求袜漩,CORS支持所有類型的HTTP請求绪爸。JSONP的優(yōu)勢在于支持老式瀏覽器,以及可以向不支持CORS的網(wǎng)站請求數(shù)據(jù)宙攻。 - html5中新規(guī)定的window.postMessage來實現(xiàn)跨域奠货。
4. 一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發(fā)生了什么座掘?
1递惋、瀏覽器會開啟一個線程來處理這個請求柔滔,對 URL 分析判斷如果是 http 協(xié)議就按照 Web 方式來處理;
2、調(diào)用瀏覽器內(nèi)核中的對應(yīng)方法萍虽,比如 WebView 中的 loadUrl 方法;
3睛廊、通過DNS解析獲取網(wǎng)址的IP地址,設(shè)置 UA 等信息發(fā)出第二個GET請求;
4杉编、進行HTTP協(xié)議會話超全,客戶端發(fā)送報頭(請求報頭);
5、進入到web服務(wù)器上的 Web Server邓馒,如 Apache嘶朱、Tomcat跺涤、Node.JS 等服務(wù)器;
6贤壁、進入部署好的后端應(yīng)用,如 PHP目养、Java救军、JavaScript财异、Python 等,找到對應(yīng)的請求處理;
7唱遭、處理結(jié)束回饋報頭宝当,此處如果瀏覽器訪問過,緩存上有對應(yīng)資源胆萧,會與服務(wù)器最后修改時間對比庆揩,一致則返回304;
8、瀏覽器開始下載html文檔(響應(yīng)報頭跌穗,狀態(tài)碼200)订晌,同時使用緩存;
9、文檔樹建立蚌吸,根據(jù)標記請求所需指定MIME類型的文件(比如css锈拨、js),同時設(shè)置了cookie;
10、頁面開始渲染DOM羹唠,JS根據(jù)DOM API操作DOM,執(zhí)行事件綁定等奕枢,頁面顯示完成。