面试复习题一
一、严格模式
1、什么是严格模式
JavaScript严格模式(use strict)就是指定代码在严格模式下运行。
2、严格模式有什么作用
- 消除JS语法的不合理、不严谨用法;
- 保证代码运行的安全;
- 提高编译效率,增加运行速度。
3、用法
(1)通过在脚本或函数的头部添加"use strict";表达式来声明。 比如下方的实例中使用了严格模式,检查结果会出现报错信息x未定义:
<script>
"use strict";
myFunction();
function myFunction() {
x = 6;
}
</script>
(2)在函数内部声明只作用于局部(即只在函数内部有作用) 比如在下方的实例中检查x和y的结果时,x不会报错,y会报错,因为x在函数的外部,而严格模式只作用于函数内部:
<script>
x = 5; // 不报错
myFunction();
function myFunction() {
"use strict";
y = 8; // 报错 (y 未定义)
}
</script>
4、严格模式的特性
这个特性也可以说是限制
- 变量必须先声明,即不可以使用未声明的变量;
- 删除后的变量不能使用;
- 变量不能重名;
- 变量名不能使用 "arguments" 字符串;如var arguments = 3.14; 会报错;
- 函数的参数名字不能一样;
- 块级作用域中不能声明函数;
- 禁止this关键字指向全局对象。
二、事件流
1、什么是事件流
页面触发事件时,可以说是点击事件发生时,页面会按照一定的顺序来响应这个事件,这个响应的过程就是事件流。
2、事件流的三个阶段
捕获阶段 目标阶段 冒泡阶段
3、捕获流和冒泡流的区别
捕获流是由外向里依次响应,冒泡流是由里向外依次响应
4、手动设置响应事件方式
大部分浏览器默认事件冒泡流的方式来响应事件,我们也可以通过addEventListener(事件,处理函数,false)来手动设置,我们只需要更改第三个参数false,当第三个参数为false时是冒泡流,当第三个参数为true时是捕获流。
5、阻止事件
- 阻止冒泡和捕获 w3c的方法是e.stopPropagation(),IE的方法是使用e.cancelBubble = true
- 阻止默认事件 w3c的方法是e.preventDefault(),IE的方法是使用e.returnValue = false;
- return false javascript的return false只会阻止默认行为,而jQuery的return false既阻止默认行为又防止对象冒泡。
三、实现apply call bind
1、它们的作用
apply() call() bind()都是用来重定义this对象的(即改变this的指向)。
2、对比apply() call()和bind()
从如下代码中可以看出它们的区别:
<script>
var name = '张三',
age = 20;
var obj = {
name: '李四',
age: 22,
fun: function (a, b) {
console.log(this.name + '高中了,他已经' + this.age + '了,他将从' + a + '去往' + b + '上学');
}
}
var obj2 = {
name: '王五',
age: 25
}
obj.fun.call(obj2, '郑州', '上海');
obj.fun.apply(obj2, ['郑州', '上海']);
obj.fun.bind(obj2, '郑州', '上海')();
</script>
- 在全局函数中,this指向的都是window
- 它们的第一个参数都是this的指向对象;
- call的第二个参数直接放在第一个参数后面,用逗号隔开,可以有多个参数,不同的参数之间用逗号隔开;
- apply的其余参数必须放在一个数组里;
- bind的参数和call一样,但是bind返回的是一个函数,且必须被调用了才会执行
四、Promise(回调地狱的解决方案)
1、Promise是什么?
Promise实质是一个函数,通过这个函数创建一个Promise对象,在这个Promise对象里存储一个状态,这个状态会随着内部代码执行而转变,它有三种状态,分别为:resolve(被解决) reject(被拒绝) pending(处理中)
2、Promise的使用
- 已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。
var Promise = new Promise(function(resolve, reject){
//当异步代码执行成功时,调用resolve(...), 当异步代码失败时调用reject(...)
setTimeout(function(){
resolve("成功!"); //代码正常执行!
}, 250);
});
promise.then(function(success){}).catch(onRejected)//回调resolve和reject,success的值是resolve方法传入的值
- promise.all()多个请求同时执行,统一返回
- Promise.race()只接收第一个被解决的结果并执行
五、Ajax
1、原理
在⽤户和服务器之间加了—个中间层( AJAX引擎),通过XmlHttpRequest 的实例化对象来向服务器发送异步请求,从服务器获得数据,然后⽤ js来操作DOM⽽更新⻚⾯。
2、对比同步和异步
- 同步:当用户发送请求时,当前页面不可以使用,服务器响应页面到客户端,必须等到响应完成,用户才可以使用页面。
- 异步:当用户发送请求时,当前页面还可以继续使用,当异步请求的数据响应给页面,页面才把数据显示出来。
3、使用
- const xhr=new XMLHttpRequest;创建异步对象
- XMLHttpRequest.open('方法','地址',默认true)初始化请求
- XMLHttpRequest.send(null)发送请求
- XMLHttpRequest.onreadystatechange=()=>{回调函数}监听状态变化(当readystate属性值变化时,执行readystatechange属性指向的回调函数)