let“let是更完美的var”,它有着更好的作用域规则。

ES5没有块级作用域,只有全局作用域和函数作用域,由于这一点,变量的作用域甚广,所以一进入函数就要马上将它创建出来。这就造成了所谓的变量提升。
  
  ES5的“变量提升”这一特性往往一不小心就会造成一下错误:内层变量覆盖外层变量执行则}}变量泄露,成为全局变量}往常我们往往是使用闭包来解决这一问题的(比如自执行函数)。现在,基于这一问题,ES6增加了块级作用域,所以不再需要自执行函数了。
  
  let 和ES6是是向后兼容的,而保持向后兼容性意味着永不改变JS代码在Web平台上的行为,所以var创建的变量其作用域依旧将会是全局作用域和函数作用域。这样以来,即使拥有了块级作用域,也无法解决ES5的“变量提升”问题。所以,这里ES6新增了俩个新关键词:let和const。
  
  let“let是更完美的var”,它有着更好的作用域规则。
  
  声明一个只读的常量。一旦声明,常量的值就不能改变,但声明的对象可以有属性变化(对象冻结Object.www.gsktv.net freeze)
  
  可执行报错也可以使用Object.freeze将对象冻结// 常规模式时,下面一行不起作用;// 严格模式时,该行会报错使用let和const:变量只在声明所在的块级作用域内有效变量声明后方可使用(暂时性死区)
  
  不能重复定义变量声明的全局变量,不属于全局对象的属性this关键字我们知道,ES5函数中的this指向的是运行时所在的作用域。比如}在这里,我声明了一个函数foo,其内部为一个延迟函数setTimeout,每隔100ms打印一个this.id。我们通过foo.call({id:42})来调用它,并且为这个函数设定作用域。它真正执行要等到100毫秒后,由于this指向的是运行时所在的作用域,所以这里的this就指向了全局对象window,而不是函数foo。这里:使用call来改变foo的执行上下文,使函数的执行上下文不再是window,从而来辨别setTimeout中的this指向方法挂在window对象下,所以其this指向执行时所在的作用域——window对象。
  
  超时调用的代码都是在全局作用域中执行的,因此函数中this 的值在非严格模式下指向window 对象,在严格模式下是undefined --《javascript高级程序设计》
  
  为了解决这一问题,我们往常的做法往往是将this赋值给其他变量:}而现在ES6推出了箭头函数解决了这一问题。
  
  箭头函数标识符=> 表达式// 等同于};如果函数只有一个参数,则可以省略圆括号如果函数只有一条返回语句,则可以省略大括号和如果函数直接返回一个对象,必须在对象外面加上括号。(因为一个空对象{}和一个空的块 {} 看起来完全一样。所以需要用小括号包裹对象字面量。)
  
  针对this关键字的问题,ES6规定箭头函数中的this绑定定义时所在的作用域,而不是指向运行时所在的作用域。这一以来,this指向固定化了,从而有利于封装回调函数。
  
  }注意:箭头函数this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this。而箭头函数根本没有自己的this,其内部的this也就是外层代码块的this。这就导致了其:不能用作构造函数不能用call()、apply()、bind()这些方法去改变this的指向类与继承传统ECMAScript没类的概念,它描述了原型链的概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。而实现这一行为的传统方法便是通过构造函数:}};在这里,构造函数Point会有一个原型对象(prototype),这个原型对象包含一个指向Point的指针(),而实例p包含一个指向原型对象的内部指针(prop)。所以整个的继承是通过原型链来实现的。详情可见我的这篇文章:javascript中的prototype和ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。但是类只是基于原型的面向对象模式的语法糖。对于class www.zgktv.cn 的引入,褒贬不一,很多人认为它反而是一大缺陷,但对我来说,这是一个好的语法糖,因为往常的原型链继承的方式往往能把我绕那么一会儿。
  
  //定义类}}}类里面有一个constructor www.yxin7.com 方法,它是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
  
  方法中的this关键字代表实例对象,定义“类”的方法(如上例的toString)的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
  
  使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致类的所有方法都定义在类的prototype属性上面的继承之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。
  
  调用父类的}调用父类的}}关键字,作为函数调用时(即(...args)),它代表父类的构造函数;作为对象调用时(即.prop或.method()),它代表父类。在这里,它表示父类的构造函数,用来新建父类的this对象。
  
  子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。
  
  模块化历史上,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来,这对开发大型的、复杂的项目形成了巨大障碍。为了适应大型模块的开发,社区制定了一些模块加载方案,比如CMD和AMD。
  
  ES6的模块化写法:上面代码的实质是从fs模块加载3个方法,其他方法不加载。这种加载称为“编译时加载”,即ES6可以在编译时就完成模块加载,效率要比CommonJS模块的加载方式高。当然,这也导致了没法引用ES6模块本身,因为它不是对象。
  
  模块功能主要由两个命令构成:用于规定模块的对外接口,对外的接口,必须与模块内部的变量建立一一对应关系。
  
  // 写法一//错误// 写法二//错误// 写法三  重命名用于输入其他模块提供的功能,它接受一个对象(用大括号表示),里面指定要从其他模块导入的变量名(也可以使用*号整体加载)
  
  字符串插值在javascript的开发中,我们常常需要这样来输出模板:}}我们需要使用+来连接字符串和变量(或者表达式)。例子比较简单,所以看上去无伤大雅,但是一旦在比较复杂的情况下,就会显得相当繁琐不方便,这一用法也让我们不厌其烦。对此,ES6引入了模板字符串,可以方便优雅地将 JS 的值插入到字符串中。
  
  模板字符串对于模板字符串,它:使用反引号``包裹;使用${}来输出值;${}里的内容可以是任何 JavaScript www.xyseo.net 表达式,所以函数调用和算数运算等都是合法的;如果一个值不是字符串,它将被转换为字符串;保留所有的空格、换行和缩进,并输出到结果字符串中(可以书写多行字符串)
  
  内部使用反引号和大括号需要转义,转义使用反斜杠\对于上面的例子,模板字符串的写法是:}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值