1.JS函数的执行时机
- 执行以下代码输出结果为6个6,由于setTimeout()函数的存在,每次for循环执行完时也就是i=6时将i打印出来;
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 执行以下代码输出结果为0、1、2、3、4、5、6,因为let i 的是区块变量,每个i只能存活到大括号结束,并不会把后面的for循环的 i 值赋给前面的setTimeout中的i;而var i 则是局部变量,这个 i 的生命周期不受for循环的大括号限制。
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
2.函数的几种存在形式;
let a =function(x,y){
return x+y
}
- 具名函数:以下函数直接执行fu()不生效,fu的作用域只在等于号的右边;全局需执行a();
let a =function fu(x,y){
return x+y
}
- 箭头函数:左边输入参数,右边输出参数;一个参数可以省略括号和花括号;如若返回是一个对象,记得用圆括号包起来;
let f1 = (x,y) =>{
console.log(x*y)
return x+y
}
3.返回值:
- 每个函数都有返回值(return的结果)
- 函数执行完了才会返回
- 只有函数有返回值
4.调用栈:JS引擎在调用一个函数前,需要把函数所在的环境push进一个数组里,这个数组叫调用栈,等执行完了,就会把环境pop出来,然后return到之前的环境,继续执行后续代码。
5.递归:先递进(压栈),再回归(弹栈);
f(4)
=4*f(3)
=4*(3*f(2))
=4*(3*(2*f(1)))
=4*(3*(2*(1)))
=4*(3*(2))
=4*(6)
=24
6.this
- 除了箭头函数外,每个函数都有arguments和this。
- 如果你传的this不是对象,在不是严格模式的情况下,浏览器会自动帮你封装成对象。当你传的值是undefined,this指向window.
- 箭头函数里面的this就是外面的this,就算你使用call也没办法改变箭头函数的this指向。