导航
因为 var 存在三个特性或者说问题:
而 let、const 解决了这些问题:
在 ES5 中,顶层对象的属性和全局变量是等价的,var 命令和 function 命令声明的全局变量,自然也是顶层对象。
var a = 12;
function f() {};
console.log(window.a); // 12
console.log(window.f); // f() {}
但 ES6 规定,var 命令和 function 命令声明的全局变量,依旧是顶层对象的属性,但 let 命令、const 命令、class 命令声明的全局变量,不属于顶层对象的属性。
let aa = 1;
const bb = 2;
console.log(window.aa); // undefined
console.log(window.bb); // undefined
在哪里?怎么获取?通过在设置断点,看看浏览器是怎么处理的:
通过上图也可以看到,在全局作用域中,用 let 和 const 声明的全局变量并没有在全局对象中,只是一个块级作用域(Script)中
怎么获取?在定义变量的块级作用域中就能获取啊,既然不属于顶层对象,那就不加 window(global)呗。
let aa = 1;
const bb = 2;
console.log(aa); // 1
console.log(bb); // 2
const a = () => 1;
console.log(a.prototype); // undefined
...args
是个真数组arguments
是类数组等到当前脚本的同步任务和“任务队列”中已有的事件,全部处理完以后,才会执行 setTimeout 指定的任务
参考:JavaScript 运行机制详解:再谈Event Loop
来源:https://www.mulingyuer.com/archives/758/
//模拟异步请求
function axiosFn() {
return new Promise((resolve, reject) => {
const flge = Math.random(); //随机值
setTimeout(() => {
//大于0.7就是成功
if (flge > 0.7) {
return resolve(flge);
} else {
return reject(flge);
}
}, 1000)
})
}
/**
* @description: promise 失败重试方法
* @param {*} fn 异步函数
* @param {*} times 次数
* @Date: 2022-02-20 22:47:54
* @Author: mulingyuer
*/
Promise.retry = function(fn, times) {
return new Promise(async (resolve, reject) => {
while (times--) {
try {
const res = await fn();
//请求成功,结束while循环
return resolve(res);
} catch (error) {
//请求失败
if (times > 0) {
console.log(`请求失败正在重试,还剩${times}次,错误信息为:${error}`);
} else {
console.log(`请求失败,重试${times}次后,还是失败,错误信息为:${error}`);
return reject(error);
}
}
}
})
}
//测试
Promise.retry(axiosFn, 3).then(res => {
console.log(`获得的数据为:${res}`);
}).catch(error => {
console.log(`失败了,错误信息为:${error}`);
});
是 generator + Promise 的语法糖,主要的作用是用同步方式执行异步操作,await 只能在 async 函数中使用,async 函数执行会返回一个 Promise,值由函数的 return 值所决定
try catch
捕获错误,不能 return比如 sleep(1000) 意味着等待1000毫秒,可从 Promise、Generator、Async/Await 等角度实现。
// Promise
const sleep = delay => new Promise(resolve => setTimeout(resolve, delay))
sleep(1000).then(() => console.log('Done'));
// Generator
function* sleepGenerator(delay) {
yield new Promise(resolve => setTimeout(resolve, delay))
}
sleepGenerator(1000).next().value.then(() => console.log('Done'));
// async / await
const sleep = delay => new Promise(resolve => setTimeout(resolve, delay))
async function output() {
await sleep(1000)
console.log('Done')
}
output()
// ES5
function sleep(cb, delay) {
if (typeof cb === 'function')
setTimeout(cb, delay)
}
function output() {
console.log('Done')
}
sleep(output, 1000)
let fs = require('fs')
let arr = []
function fn(data) {
arr.push(data)
if (arr.length === 2) {
console.log(arr)
}
}
fs.readFile('./name.text', 'utf8', (err, data) => {
fn(data)
})
fs.readFile('./age.text', 'utf8', (err, data) => {
fn(data)
})