【前端--面试】常见面试题(十二)—— 简答题

160 阅读2分钟

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

模块化发展历程

模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。 我们可以从IIFE、AMD、CMD、CommonJS、UMD、webpack(require.ensure)、ES Module、<script type="module"> 这几个角度考虑。

  • IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突
(function(){
  return {
    data:[]
  }
})()
  • AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好
define('./index.js',function(code){
    // code 就是index.js 返回的内容
})
  • CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件
define(function(require, exports, module) {  
  var indexCode = require('./index.js');
})
  • CommonJS: nodejs 中自带的模块化。
const fs = require('fs');
  • UMD:兼容AMD,CommonJS 模块化语法。

  • webpack(require.ensure) :webpack 2.x 版本中的代码分割。

  • ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。

import a from 'a';

ES5的继承和ES6的继承有什么区别

ES5的继承时通过prototype或构造函数机制来实现。

ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.apply(this))。

ES6的继承机制完全不同,实质上是先创建父类的实例对象this(所以必须先调用父类的super()方法),然后再用子类的构造函数修改this

ES6通过class关键字定义类,里面有构造方法,类之间通过extends关键字实现继承。子类必须在constructor方法中调用super方法,否则新建实例报错。因为子类没有自己的this对象,而是继承了父类的this对象,然后对其进行加工。如果不调用super方法,子类得不到this对象。

super关键字指代父类的实例,即父类的this对象。在子类构造函数中,调用super后,才可使用this关键字,否则报错。

fetch发送2次请求的原因

fetch发送post请求的时候,总是发送2次,第一次状态码是204,第二次才成功?

因为你用fetch的post请求的时候,导致fetch 第一次发送了一个Options请求,询问服务器是否支持修改的请求头,如果服务器支持,则在第二次中发送真正的请求。