前端面试真题解读2
this代表谁的问题 call apply bind 区别
- 不解释了,讲过很多遍
用过jquery的proxy么?
- 在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个,比如定时器中的this;
- 但是,在使用了jquery框架的情况下, 有一种更好的方式,就是使用$.proxy函数。
- jQuery.proxy(),接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文(context )语境。所以,
语法:jQuery.proxy( function, context )
//$.proxy类似于我们之前封装的processThis,都是用来保证正确的this指向;
$('#myElement').click(function() {
setTimeout($.proxy(function() {
$(this).addClass('aNewClass');
}, this), 1000);
});
jquery的事件绑定和解绑的原理
- 事件库
- (我要求大家能把:订阅发布+事件库 完整的写下来)
js数组和php数组的关系
一:数组
a、js定义数组:
var arr = new Array(); //定义空数组
var arr = new Array(2); //仅指定长度,而且指定的长度没多大意义
var arr = new Array(1,2,3); //定义数组并赋初值1,2,3
var arr = [1,2,3]; //同上,不过比上面的速度快
*:js数组只能通过'[]'访问属性。
b、php定义数组:
$arr = array(); //定义空数组
$arr = array(1); //与js不同,这里是给键值0的值
$arr = array(1,2,3); //定义数组并赋值1,2,3
$arr = [1,2,3]; //同上,速度不知与js是否有异曲同工之妙?另高版本的php才支持这种写法
*:php能通过'[]'和'{}'访问。
** 参考地址** http://blog.csdn.net/stpeace/article/details/50734548
对象和数组的关系
1、数组表示有序数据的集合,而对象表示无序数据的集合。
2、数组的数据没有”名称”(name),对象的数据有”名称”(name);
3、数组是对象的子类,就是说对象的一些特性数组都会继承,只不过数组扩展了很多自己独有的属性和方法。
画js盒模型 css3盒模型
- js盒子模型:指的是通过js中提供的一系列的属性和方法,获取页面中元素的样式信息值:
- client系列 offset系列 scroll系列
- css的两种盒模型content-box 和 border-box 参考如下链接中的图
()[http://jingyan.baidu.com/article/48b558e32ea8a97f38c09a9e.html]
了解跨域么?你知道哪几种跨域? jsonp为什么只能是get请求。 cors 怎么实现等。服务器设置的头 支持正则么
了解跨域么?
域名A中的JS代码AJAX请求域名为B的服务器数据,这就是跨域AJAX请求,默认情况下是不行的。
但是HTML中有地方可以跨域请求,比如img script标签,它们的src属性指向的地址可以是不在域名A下的(即跨域)。
你知道哪几种跨域?
1、 图像ping
图像ping是与服务器进行简单,单项的跨域通信的一种方式
var img=new Image();
img.onload=img.onerror=function(){
alert("done")
}
img.src="http://www.example.com/test?name=sl";
2、jsonp(最实用) jsonp是通过动态<script>元素来使用的
function callbackFunction(){
alert("回滚");
}
var script=document.createElement("script");
script.src="http://frergeoip.net.json/?callback=callbackFunction";
document.body.insertBefore(script,document.body.firstChild);
3、使用jquery实现跨域(最简单的)
- 查看jquery中的$.getJSON方法即可;
<script> $.getJSON("http://example.com/data.php?callback=?",function(jsondata){ //回调事件 }); </script>
4、通过修改document.domain来跨子域
- 在页面 http://www.example.com/a.html 中设置document.domain:
<iframe src="http://example.com/b.html" id="iframe" onload="test()"></iframe>
<script>
document.domain="example.com"; //设置成他们的父域
function test(){
document.getElementById("iframe").contentWindow;
}
</script>
5、使用window.name来进行跨域
- window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。
6、CORS
cors 怎么实现?
- 核心思想:在服务器端通过检查请求头部的origin,从而决定请求应该成功还是失败。具体的方法是在服务端设置Response Header响应头中的Access-Control-Allow-Origin为对应的域名,实现了CORS(跨域资源共享)
- 这里出于在安全性方面的考虑就是尽量不要用 *,但对于一些不重要的数据则随意。
jsonp为什么只能是get请求
- jsonp的核心:script中src能够跨域获得内容的方式(src中请求都是GET);
- 具体原因如下:
拼接一个script标签,<script src="http://path/to/server/b?A=a&B=b&callbackFunctionName=myCallback"></script>,从而触发对指定地址的GET请求
那服务器端对这个GET请求进行处理,并返回字符串 "myCallback('response value')"
那前端script加载完之后,其实就是在script中执行myCallback('response value')
是不是就完成了跨域的请求,
是不是就是只能用GET
跨域请求时会自动发送凭证信息么?
- 不会,若让请求自动带上凭证,需要将withCredentials属性设置为true。
- 需要服务器端支持,设置Access-Control-Allow-Credentials=true响应头;
如何传递cookie或token等验证信息?
- 后端服务器有两种基本的身份验证:
1、是基于Cookie的身份验证,使用服务器端的cookie来对每次请求的用户进行身份验证。
2、较新的方法,基于令牌Token的认证,依赖于被发送到服务器上每个请求的签署令牌。 - 每一次请求都需要token。token应该在HTTP的头部发送从而保证了Http请求无状态。我们同样通过设置服务器属性Access-Control-Allow-Origin:* ,让服务器能接受到来自所有域的请求。
web前端怎么用代码实现缓存优化?
针对浏览器设置过期时间,在这个时间内的请求都会先请求本地缓存的文件和数据。另外jquery的ajax请求方式可以设置是否缓存(cache:true),可以充分利用该选项。
后台如何实现缓存?
- 无论什么后台语言,想实现缓存,把它放在redis/memcached等缓存里都是最好的选择;
缓存的代码上线后如何里面让其生效?
构建工具会帮助给js等文件加md5值
写个布局, 左面导航的高度和右侧内容的高度保持一致,如何做?
讲讲各种状态码。 304需要服务器端么? Etag和那个匹配等?
讲讲各种状态码。
- 常见HTTP状态码
1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态码。
2xx(成功)表示成功处理了请求的状态码。200(成功):服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
3xx(重定向)要完成请求,需要进一步操作。
301(永久移动):请求的网页已永久移动到新位置。
302(临时移动):服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
304(未修改):自从上次请求后,请求的网页未修改过。
4xx(请求错误)这些状态码表示请求可能出错,妨碍了服务器的处理。
400(错误请求):服务器不理解请求的语法。404(未找到):服务器找不到请求的网页。
5xx(服务器错误)这些状态码表示服务器在处理请求时发生内部错误。
500(服务器内部错误):服务器遇到错误,无法完成请求。
503(服务不可用):服务器目前无法使用(由于超载或停机维护)
304需要服务器端么?
- 服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
304是HTTP状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到个状态码后,会使用浏览器已缓存的文件;
Etag和那个匹配等?
Etag 和 If-None-Match 对应 Last-Modified 和 If-Modified-Since 对应