之前只有全局变量以及函数内部的局部变量,因此之前的局部变量只能定义在函数里面,可是如今不是了,能够经过let关键字来定义局部变量。同时经过const关键字来定义常量,定义后的基本类型数据是不能改变的,可是定义的是引用类型的变量的话,仍是能够改变的。javascript
1.箭头函数,在回调中颇有做用,箭头函数永远是匿名的css
2.this在箭头函数中的使用:在嵌套函数中,碰到setInterval, setTimeout等定时器函数时,this会发生漂移,指向windows(global对象),之前咱们要将this缓存[var self = this;]()或者经过[(){}.bind(this]())来改变this的内部函数的指向,可是有了箭头函数后,不再用更担忧这个问题了;html
3.函数默认参数,之前的函数默认参数 [var a = a || []]();可是ES6支持了函数的默认参数;前端
4.rest参数[...](),rest参数是没有指定变量名的参数数组,而arguments是全部参数的集合。并且arguments参数不是一个真正的数组,而rest参数是一个真的数组,能够调用sort和map方法。能够告别arguments参数了;java
...能够用于函数的调用,数组字面量,以及对象的展开(ES7).webpack
用反引号标识。它能够看成普通字符串使用,也能够用来定义多行字符串,或者在字符串中嵌入变量。模板字符串中嵌入变量,须要将变量名写在${}
之中。es6
// 字符串中嵌入变量 var name = "Bob", time = "today"; Hello {name}, how are you {time}?
解构方法能够很快的从数组或者对象中提取变量,能够用一个表达式读取整个解构;web
JavaScript是原型继承的,但声明起来却很怪,全部提供了一个原型链的class语法糖。经过class
关键字定义了一个“类”,能够看到里面有一个constructor
方法,这就是构造方法,而this
关键字则表明实例对象。constructor方法是类的默认方法,经过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,若是没有显式定义,一个空的constructor方法会被默认添加。shell
注意,定义“类”的方法的时候,前面不须要加上function
这个关键字,直接把函数定义放进去了就能够了。另外,方法之间不须要逗号分隔,加了会报错。类的数据类型就是函数,类自己就指向构造函数。npm
Class之间能够经过extends
关键字实现继承,这比ES5的经过修改原型链实现继承,要清晰和方便不少。
子类必须在constructor
方法中调用super
方法,不然新建实例时会报错。这是由于子类没有本身的this
对象,而是继承父类的this
对象,而后对其进行加工。若是不调用super
方法,子类就得不到this
对象。另外一个须要注意的地方是,在子类的构造函数中,只有调用super
以后,才可使用this
关键字,不然会报错。这是由于子类实例的构建,是基于对父类实例加工,只有super
方法才能返回父类实例。
super
这个关键字,既能够看成函数使用,第一种状况,super
做为函数调用时,表明父类的构造函数。第二种状况,super
做为对象时,指向父类的原型对象。能够采用super(). + 方法名字来调用父类的方法。
类至关于实例的原型,全部在类中定义的方法,都会被实例继承。若是在一个方法前,加上static
关键字,就表示该方法不会被实例继承,而是直接经过类来调用,这就称为“静态方法”。
1.首先推出Require.js的AMD规范,Node.js诞生后,随之而来的是CommonJS格式,后来的browerify,知道es6推出了模块化,对模块化进行了支持;
es6模块功能主要由两个命令构成:export
和import
。export
命令用于规定模块的对外接口,import
命令用于输入其余模块提供的功能。经过as取别名。
export {firstName, lastName, year}; import {firstName, lastName, year} from './profile'; function setName(element) { element.textContent = firstName + ' ' + lastName; }
各类方案层出不穷,JavaScript不断发展,致使不少性能没法普及,babel提供了JavaScript多用途编译器。让你能够开心的使用ES6.
Babel经过安装插件(plugin)或者预设(preset,就是一组设定好的插件)来编译代码。建立一个.babelrc文件。
{ "presets":[], "plugins":[] }
首先要明白两个概念:模块(module)和组件(component),模块是指的语言层面的,在前端大多数指的是一个JavaScript模块,每每变现为一个JavaScript文件,以及其对外暴露的一些属性和方法。组件更偏向于业务层面,每每是一个独立功能的实现,好比一个下拉菜单,文本编辑器,路由系统等。一个组件每每包括其所需的全部资源,包括逻辑js,样式css,模板html(template),甚至图片和文字。
1.全局变量+命名空间:
避免污染全局做用域,模块内部一般用匿名自执行函数。问题多多:(1)依赖全局变量,污染全局变量的同时,不安去.(2)依赖约定的命名空间,不可靠。(3)要手动管理并控制执行,容易出错,在上线前要手动合并一些模块
2.AMD+CommonJs
解决时上述的问题,全局下定义require和define,不须要其余变量
经过文件路径或模块声明来定义模块
依赖与加载都是由加载器完成,提供了打包工具自动分析依赖并合并
3.ES6模块化
JavaScript带来了本身的模块化方案,相比AMD/CommonJS,功能更强大,引用和暴露的方式更多样,支持复杂的静态分析,使构建工具更细粒度地移除模块实现中的无用代码。
1.基于命名空间的多入口文件
基于前面的第一种模块化方案,不一样资源手动导入,最典型的就是jQuery插件;
2.基于模块的多入口文件
随着前端模块化方案的流行,组件也趋于AMD这样的规范,把组件也暴露为一个模块。一个AMD模块的JavaScript,一个CSS(Less,Sass)模块的样式,以及其余资源。
3.单JavaScript入口的组件
这是如今比较流行的方案,借助browerify、webpack这样的打包工具,容许咱们将通常的资源当作JavaScript模块来对待。并一致的加载进来。
4.Web Component
这是组件化里的国家队,与2011年提出,可是还处于不温不火的状态,主要包括自定义元素(Custom Element)、HTML模板(HTML Template)、Shadow DOM、HTML 的引入(HTML Import)
1.包管理工具
用来安装、管理和分享JavaScript包,同时自动处理多个包之间的依赖。主要有包管理工具,Bower、Component、Spm、以及Node.js的亲儿子npm;
2.任务流工具
在前端项目中会遇到各类各样的任务,好比压缩合并代码、验证代码格式、测试代码、监视文件等等,执行这些方法不可能每次都去手动写这些命令,很是麻烦,接触Linux的确定会想到shell脚本。如今前端比较流行的有Grunt和Gulp两个;
3.模块打包工具
主要有bundler和webpack两个,webpack做为后起之秀,它支持AMD、CommonJS类型,经过loader机制也可使用ES6的模块格式,正向一个全能型构建工具发展。