1.可以重复声明 不报错
var a=12; var a=5; alert(a) //52.没有块级作用域(语法块)
{ 变量=123 } for(...){ var a=12 } alert(a) 12函数
数组
字符串
字符串拼接 反单引号
let str=`abc`; let str2=`a${str}bc` alert(str2)//aabcbc面向对象
promise-承诺
异步同步操作之间没关系,同时进行多个操作。回调地狱,一直使用ajax请求同时能做一件事。一个再走下一个代码复杂代码简单promise==消除异步操作
用同步的方式书写异步代码
let p=new Promise(function(resolve,reject){ /* resolve 成功推荐 reject 失败回调 */ $.ajax({ url:'aaa.txt', dataType:'json', success:(arr)=>{ resolve(arr); }, error:(err)=>{ reject(err); } }) }) p.then(function(){ alert("成功回调") },function(){ alert("失败回调") });好处显现
let p=new Promise(function(resolve,reject){ /* resolve 成功推荐 reject 失败回调 */ $.ajax({ url:'aaa.txt', dataType:'json', success:(arr)=>{ resolve(arr); }, error:(err)=>{ reject(err); } }) }) let p1=new Promise(function(resolve,reject){ /* resolve 成功推荐 reject 失败回调 */ $.ajax({ url:'bbb.txt', dataType:'json', success:(arr)=>{ resolve(arr); }, error:(err)=>{ reject(err); } }) }) Promise.all([ p,p1 ]).then(function(arr){ let [res1,res2]=arr; //arr数组作为结果 console.log(res1) //aaa.txt文件内容 console.log(res2)//bbb.txt文件内容 alert('全部成功了') },function(){ alert('至少一个失败了') })简化操作 封装promise
function createPromise(url){ return new Promise(function(resolve,reject){ $.ajax({ url:url, dataType:'json', success:(arr)=>{ resolve(arr); }, error:(err)=>{ reject(err); } }) } ) } Promise.all([ createPromise('aaa.txt') createPromise('bbb.txt') ]).then(function(arr){ let [res1,res2]=arr; //arr数组作为结果 console.log(res1) //aaa.txt文件内容 console.log(res2)//bbb.txt文件内容 alert('全部成功了') },function(){ alert('至少一个失败了') })更进一步 jquery的封装promise
let p=$.ajax({url:'aaa.txt',dataType:'json'}) 返回的是promise对象 直接 Promise.all([ $.ajax({url:'aaa.txt',dataType:'json'}) $.ajax({url:'bbb.txt',dataType:'json'}) ]).then(function(arr){ let [res1,res2]=arr; //arr数组作为结果 console.log(res1) //aaa.txt文件内容 console.log(res2)//bbb.txt文件内容 alert('全部成功了') },function(){ alert('至少一个失败了') })最简单大致的写法
Promise.all([ajax1,ajax2]).then(success=>{},error=>()) 封装为一个promise方法 console.log(111); let promise = new Promise((resolve, reject) => { setTimeout(function () { console.log(222); resolve("hello word") },3000) }) promise.then((data)=>{ console.log(333); console.log(data); }).catch(()=>{ console.log(444);//错误进入 }) /* 111 222 333 hello word */generator
模块化
在一个单独的js文件中export抛出模块
export function show(){ console.log("模块化执行show的方法") } export let show1=()=>{ console.log("模块化执行show1的方法") } import {show,show1} from './js/es6' show(); show1(); //分别执行控制台打印的内容1、export 一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。下面是一个 JS 文件,里面使用export命令输出变量。
export写法一般如下:
var firstName = 'name'; var lastName = 'last'; var year = 1996; export { firstName, lastName, year };通常情况下,export输出的变量就是本来的名字,但是可以使用as关键字重命名。例:
function v1() { ... } function v2() { ... } export { v1 as streamV1, v2 as streamV2, v2 as streamLatestVersion };上面代码使用as关键字,重命名了函数v1和v2的对外接口。重命名后,v2可以用不同的名字输出两次。
2、import 使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。例:
import { firstName, lastName, year } from './profile.js'; function setName(element) { element.textContent = firstName + ' ' + lastName; }当然,如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名,这也是上文说通常情况下,export输出的变量名不变的原因。例:
import { lastName as surname } from './profile.js';另外,注意import命令具有提升效果,会提升到整个模块的头部,首先执行。
3、export default 从前面的例子可以看出,使用import命令的时候,用户需要知道所要加载的变量名或函数名,否则无法加载。这就产生一个问题,使用模块者不愿阅读文档,不想知道变量名。此时就要用到export default命令,为模块指定默认输出。
person.js文件 export default { firstName:'first', lastName:'last', age: 11 } 此时import导入写成: import person from 'person'; console.log(person.age) //11本质上,export default就是输出一个叫做default的变量或方法,然后系统允许你为它取任意名字。
4、总结拓展 export default 向外暴露的成员,可以使用任意变量名来import 在一个模块中,export default 只允许向外暴露一次。 在一个模块中,可以同时使用export default 和export 向外暴露成员 export可以向外暴露多个成员,同时,如果某些成员,在import导入时不需要,可以在import时不写。 使用export导出的成员,必须严格按照导出时候的名称,来使用{ }按需接收