定义一个函数
1 | // 1. 具名函数 |
函数自身与函数调用
1 | let fn = () => console.log('hi'); |
1 | let fn = () => console.log('hi'); |
1 | let fn = () => console.log('hi') |
JS函数执行时机
函数的调用时机不同,会得到不同结果
1 | let a = 1 |
1 | let a = 1 |
1 | let a = 1 |
1 | let a = 1 |
1 | let a = 1 |
异步函数
1 | let i = 0 |
如何让上面的代码打印出0,1,2,3,4,5
for、let配合使用,let会单独创建一个作用域,每次循环会多创建一个i,相当于有6个i
1
2
3
4
5for(let i = 0; i < 6; i++){
setTimeout(()=>{
console.log(i)
},0)
}在for循环内部声明一个新的变量来存储i的值
1
2
3
4
5
6
7let i
for(i = 0; i < 6; i++){
let x = i
setTimeout(()=>{
console.log(x)
},0)
}立即执行函数,把当前for循环过程中的i传递进去,构建块级作用域
1
2
3
4
5
6
7for (var i = 0; i < 6; i++){
(function(i){
setTimeout(()=>{
console.log(i)
}, 0)
})(i)
}利用setTimeout函数的第三个参数,会作为回调函数的第一个参数传入
1
2
3for(i = 0; i < 6; i++){
setTimeout(console.log(i), 1000, i)
}利用try…catch…
1
2
3
4
5
6
7
8
9for(var i = 0; i < 6; i++){
try{
throw i;
}catch(i){
setTimeout(() => {
console.log(i)
}, 0)
}
}使用递归配合setTimeout()
1
2
3
4
5function fn(i){
return i < 6 ? setTimeout(()=>{console.log(i);fn(++i),0}) : i
}
fn(0)利用promise
1
2
3
4
5
6
7
8
9
10
11for (var i = 0; i < 6; i++) {
timeoutPromise(i);
}
function timeoutPromise(i) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(i);
resolve(true);
}, 0)
})
}