整理了一些面试题

65 阅读3分钟

如何改变this指向,有什么区别

call、apply、bind三者为改变this指向的方法。

共同点:第一个参数都为改变this的指针。若第一参数为null/undefined,this默认指向window

call(无数个参数)

  • 第一个参数:改变this指向
  • 第二个参数:实参
  • 使用之后会自动执行该函数
function fn(a,b,c){
        console.log(this,a+b+c); // this指向window
    }
    fn();
    fn.call(document,1,2,3);//call改变之后this指向document  
    //输出 #document 6   1,2,3是实参 结果相加为6

apply(两个参数)

  • 第一个参数:改变this指向
  • 第二个参数:数组(里面为实参)
  • 使用时候会自动执行函数
function fn(a,b,c){
        console.log(this,a+b+c); 
    }
    fn();
    fn.apply(document,[1,2,3]); 

bind(无数个参数)

  • 第一个参数:改变this指向
  • 第二个参数之后:实参
  • 返回值为一个新的函数
  • 使用的时候需要手动调用下返回 的新函数(不会自动执行)
function fn(a,b,c){
    console.log(this,a+b+c); //window
}
let ff = fn.bind('小明',1,2,3); //手动调用一下

call、apply与bind区别:前两个可以自动执行,bind不会自动执行,需要手动调用

call、bind与apply区别:前两个都有无数个参数,apply只有两个参数,而且第二个参数为数组

事件委托或者事件代理的原理是什么?

事件委托原理:事件冒泡机制。 优点

1.可以大量节省内存占用,减少事件注册。 ​ 2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适 缺点:事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判。即本不该被触发的事件被绑定上了事件。

事件冒泡和事件捕获的区别是什么?

事件捕获

事件捕获是网景最早提出的一种事件流,由DOM最顶层节点开始,然后逐级向下传播到最具体的元素接收的过程。可以形象的比喻成将一个石头扔进水里,它会有一个下降到水底的过程,这个过程就是事件捕获阶段。

在事件捕获的概念下发生click事件的顺序应该是:

document -> html -> body -> 目标元素

事件冒泡

事件冒泡是微软最早提出的,与事件捕获相反,是由最具体的元素接收,然后逐级向上传递到DOM最顶层节点的过程。可以形象的比喻成石头落入水中下降产生的泡泡从水底冒出水面的过程,这个就是事件冒泡阶段。

在事件冒泡的概念下发生click事件的顺序应该是:

目标元素 -> body -> html -> document

你知道的es6新特性有哪些?

1. let和const命令的出现

let和const区别:const定义一个只读常量,一旦声明变量,就必须立即初始化,不能留到以后赋值且不可改变。

  1. 不存在变量提升,声明的变量一定要在声明后使用,否则报错

  2. 不允许重复声明变量,不允许在相同作用域内,重复声明同一个变量

  3. 块级作用域,ES6之前只有函数作用域与全局作用域,一个大括号即一个块级作用域

  4. 声明的变量不在属于window

    简要回答:

    1. 变量声明:由var变为let和const
    2. 模板字符串:``
    3. 对象的简化赋值:对象赋值时如果属性名和变量名一致可以简写位一个
    4. 类的使用
    5. 展开运算符:...
    6. 箭头函数
    7. 解构:有数组解构和对象解构;

js异步编程方式有几种?

回调函数 ===>>> promise ===>>> generater ===>>> async/await

promise有几种状态

三种状态
  • pending - 进行中
  • fulfilled - 成功
  • rejected - 失败