1. JavaScript原型,原型链 ? 有什么特点?
- Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型
- 原型链:由于原型对象本身也是对象,而每个javascript对象都有一个原型对象,每个对象都有一个隐藏的proto属性,原型对象也有自己的原型,而它自己的原型对象又可以有自己的原型,这样就组成了一条链,这个就是原型链。在访问对象的属性时,如果在对象本身中没有找到,则会去原型链中查找,如果找到,直接返回值,如果整个链都遍历且没有找到属性,则返回undefined。原型链一般实现为一个链表,这样就可以按照一定的顺序来查找。
- 例子
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),为什么要用它?
闭包定义过于晦涩
我理解的是 外部函数持有内部变量,且不会被销毁,闭包就是将函数内部和函数外部连接起来的一座桥梁。
作用也就是利用他的特点,可以读取函数内部的变量,让这些变量的值始终保持在内存中。
3. 如何解决跨域问题?
跨域:从一个页面去请求读或者写另一个页面的资源,突破同源策略的限制。
跨域的几种方式:
- 主域名相同,子域不同的,如:child.a.html和a.html可通过设置document.domain = a.html达到降域的目的,实现跨域访问。问题:
1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞。
2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。 - JSONP(json with padding),只支持get请求,无法判断请求是否失败(不会返回各种HTTP状态码),安全性不高,假如提供jsonp的服务存在页面注入漏洞,那么所有调用这个jsonp的网站都会存在漏洞。但它的兼容性很好,在许多老版本浏览器上都可以运行,不想XMLHttpRequest对象实现的Ajax请求那样收到同源策略的限制。
- CORS (cross-origin-resource-sharing)
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。CORS与JSONP的使用目的相同,但是比JSONP更强大。JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。 - html5中新规定的window.postMessage来实现跨域。
4. 一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
1、浏览器会开启一个线程来处理这个请求,对 URL 分析判断如果是 http 协议就按照 Web 方式来处理;
2、调用浏览器内核中的对应方法,比如 WebView 中的 loadUrl 方法;
3、通过DNS解析获取网址的IP地址,设置 UA 等信息发出第二个GET请求;
4、进行HTTP协议会话,客户端发送报头(请求报头);
5、进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器;
6、进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理;
7、处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304;
8、浏览器开始下载html文档(响应报头,状态码200),同时使用缓存;
9、文档树建立,根据标记请求所需指定MIME类型的文件(比如css、js),同时设置了cookie;
10、页面开始渲染DOM,JS根据DOM API操作DOM,执行事件绑定等,页面显示完成。