简单总结五道面试题一

316 阅读4分钟

面试复习题一

一、严格模式

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、使用

  1. const xhr=new XMLHttpRequest;创建异步对象
  2. XMLHttpRequest.open('方法','地址',默认true)初始化请求
  3. XMLHttpRequest.send(null)发送请求
  4. XMLHttpRequest.onreadystatechange=()=>{回调函数}监听状态变化(当readystate属性值变化时,执行readystatechange属性指向的回调函数)