JS 函数的执行时机

76 阅读1分钟

时机不同,调用不同

以代码为例

let i = 0
for( i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
输出结果:666666
for (let i = 0; i < 6; i++) {
setTimeout(() => console.log(i), 0);
 }
输出结果:0 1 2 3 4 5 

第一段代码:循环中的变量i的值是全局的,因此在循环期间,我们每次使用一元运算符++都会将i的值增加1。
因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为6。
setTimeout 函数作用是设定一个定时器,时间到了再执行,它需要等主线程执行完其他任务之后再执行。

第二段代码:循环内声明,使用let关键字声明变量i:此时变量i的值为局部的,使用let(和const)关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。
在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域 。
当for循环里用let声明,JavaScirpt会特殊处理,帮每个i都创建一个作用域。

函数的要素:
调用时机
作用域
闭包
形式参数
返回值
调用栈
函数提升
argument(除了箭头函数)
this(除了箭头函数)