ES5中的闭包
| <script> |
| var btns = document.getElementsByTagName("button"); |
| for (var i = 0; i < btns.length; i++) { |
| (function (i) { |
| btns[i].addEventListener('click', function () { |
| console.log('第' + i + '个按钮被点击'); |
| }) |
| })(i) |
| } |
| </script> |
ES6中的写法
| <script> |
| const btns = document.getElementsByTagName("button"); |
| for (let i = 0; i < btns.length; i++) { |
| btns[i].addEventListener('click', function (){ |
| console.log('第' + i + '个按钮被点击'); |
| }) |
| } |
| </script> |
对象增强写法
ES5:
| <script> |
| let name = 'tolerate'; |
| let age = 25; |
| let height = 1.78; |
| |
| const person = { |
| name : name, |
| age : age, |
| height : height, |
| run : function() { |
| console.log('在跑'); |
| } |
| } |
| |
| console.log(person); |
| person.run(); |
| </script> |
ES6:
| <script> |
| let lname = 'tolerate'; |
| let lage = 25; |
| let lheight = 1.78 |
| const lperson = { |
| lname, |
| lage, |
| lheight, |
| eat() { |
| console.log('在吃'); |
| } |
| } |
| |
| console.log(lperson); |
| lperson.eat(); |
| </script> |
箭头函数
-
定义函数的方法:
| |
| |
| const a = function () { |
| console.log('我是a方法'); |
| return 'Elian' |
| } |
| |
| |
| const obj = { |
| name: 'Elian' |
| } |
| |
| |
| const b = () => { |
| console.log('我是箭头函数'); |
| return "Elian" |
| } |
-
参数和返回值的问题
| |
| |
| const sum = (num1, num2) => { |
| return num1 + num2 |
| } |
| |
| const power = num => { |
| return num * num |
| } |
| |
| |
| |
| const test = () => { |
| |
| console.log('Hello World'); |
| |
| console.log('Hello Vuejs'); |
| } |
| |
| const mul = (num1, num2) => num1 * num2 |
| const demo = () => console.log('Hello Demo'); |
-
函数中this的问题
| |
| |
| const objTest = { |
| aaa() { |
| setTimeout(function (){ |
| setTimeout(function (){ |
| console.log(this) |
| }, 1000) |
| setTimeout(()=>{ |
| console.log(this) |
| }, 1000) |
| }, 1000) |
| setTimeout(()=>{ |
| setTimeout(function () { |
| console.log(this) |
| }, 1000) |
| setTimeout(()=>{ |
| console.log(this) |
| }) |
| }) |
| } |
| } |
Promise
- ES6中一个非常重要和好用的特性就是Promise
- 什么时候我们会处理异步事件呢?
- 网络请求
- 封装一个网络请求的函数,因为不能立即拿到结果,所以不能像简单的3+4=7一样将结果返回
- 所以往往我们会传入另外一个函数,在数据请求成功时,将数据通过传入的函数回调出去
定时器的异步事件
基本语法
- 这里,我们用一个定时器来模拟异步事件:
- 假设下面的data是从网络上1s后请求的数据
- console.log就是我们的处理方式
以前的写法
| setTimeout(() => { |
| console.log('HelloWorld'); |
| setTimeout(()=>{ |
| console.log('HelloVueJs'); |
| setTimeout(()=>{ |
| console.log('HelloPython') |
| }, 1000) |
| },1000) |
| }, 1000) |
Promise写法
| new Promise((resolve, reject) => { |
| setTimeout(() => { |
| resolve() |
| }, 1000) |
| }).then(()=>{ |
| console.log('HelloWorld'); |
| return new Promise((resolve, reject) => { |
| setTimeout(()=>{ |
| resolve() |
| },1000) |
| }).then(()=>{ |
| console.log('HelloVueJs'); |
| return new Promise((resolve, reject) => { |
| setTimeout(()=>{ |
| resolve() |
| }, 1000) |
| }).then(()=>{ |
| console.log('HelloPython') |
| }) |
| }) |
| }) |
Promise基本用法
| |
| new Promise((resolve, reject)=>{ |
| |
| setTimeout(()=>{ |
| |
| reject('error message') |
| }, 1000) |
| }).then((data)=>{ |
| |
| console.log(data) |
| }).catch((err)=>{ |
| console.log(err) |
| }) |
Promise三种状态
- 首先,当我们开发中有异步操作时,就可以给异步操作包装一个Promise
- 异步操作之后会有三种状态
- pending:等待状态
- fulfill:满足状态
- reject:拒绝状态
Promise的链式调用
- 我们在看Promise的流程图时,发现无论是then还是catch都可以返回一个promise对象
- 所以我们的代码其实是可以进行链式调用的
- 这里我们直接通过Promise包装了一下新的数据,将Promise对象返回了
- Promise.resovle():将数据包装成Promise对象,并且在内部回调resolve()函数
- Promise.reject():将数据包装成Promise对象,并且在内部回调reject()函数
| new Promise((resolve, reject) => { |
| setTimeout(() => { |
| resolve('HelloWorld') |
| }, 1000) |
| }).then(data => { |
| console.log(data); |
| return Promise.resolve(data + '111') |
| }).then(data => { |
| console.log(data) |
| return Promise.resolve(data + '222') |
| }).then(data=>{console.log(data)}) |
| new Promise((resolve, reject) => { |
| setTimeout(() => { |
| resolve('HelloWorld') |
| }, 1000) |
| }).then(data => { |
| console.log(data); |
| return data + '111' |
| }).then(data => { |
| console.log(data) |
| return data + '222' |
| }).then(data=>{console.log(data)}) |
Promise all()方法
- 同时处理两个网络请求,拿到两个结果才能继续执行下一步就可以用all方法了
| Promise.all([ |
| new Promise((resolve, reject) => { |
| setTimeout(()=>{ |
| const name = 'Elian' |
| console.log(name); |
| resolve(name) |
| }, 1000) |
| }), |
| new Promise((resolve, reject) => { |
| setTimeout(()=>{ |
| const age = 18 |
| console.log(age); |
| resolve(age) |
| }, 1000) |
| }) |
| ]).then(result => { |
| console.log(result[0] + result[1]); |
| }) |
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
· 记一次 .NET 某发证机系统 崩溃分析
· dotnetty 新的篇章- 开源
· 设计模式:简单工厂、工厂方法与抽象工厂
· 【大数据高并发核心场景实战】 - 数据持久化之冷热分离
· DotTrace系列:1. 理解四大经典的诊断类型(上)
· 这5种规则引擎,真香!