JS全解(五)JS 函数的执行时机🦁

1,488 阅读2分钟

重要知识点:每节博客都会重复🙉🙉🙉

口诀🤨:四基两空一对象,还有五个falsy值。

七种数据类型

  • number string bool symbol
  • null undefined
  • object

五个 falsy 值

  • null undefined
  • 0 NaN
  • '' (空字符串)

前言

JS函数在执行的时候,函数所处的位置不同,执行的结果就会各不相同。

下面我们通过几个例子来看一下,函数的执行时机对结果会产生怎样的影响。

正文

例1

let a = 1
function fn(){
    console.log(a)
}

唐僧: 徒儿,请问上例会打印出多少?

悟空:不知道,因为你压根没有调用函数fn。

例2

let a = 1
function fn(){
    console.log(a)
}
fn()

唐僧: 徒儿,请问上例会打印出多少?

八戒:很显然,是1。

例3

let a = 1
function fn(){
    console.log(a)
}
a = 2
fn()

唐僧: 徒儿,请问上例会打印出多少?

沙僧:因为fn在a=2后执行,故打印出2。

例4

let a = 1
function fn(){
    console.log(a)
}
fn()
a = 2

唐僧: 徒儿,请问上例会打印出多少?

白龙马:对比一下例3我们可以知道,fn先调用的,故会打印出1。

前面几个例子都比较简单,相信大家都可以回答出来。那么我们现在升级一下难度,请看下面这个:

猛料

所谓时机不同,结果不同~

   let i = 0
   for(i = 0; i<6; i++){
     setTimeout(()=>{
       console.log(i)
     },0)
   }
   //结果输出6个6

for循环在主线程内,setTimeout是异步方法,在任务队列里面,只有主线程执行完后,任务队列才执行,当for执行结束时候,此时的i值已经是6,所以得到结果是个6。 那么如何输出0-5呢。

   for(let i = 0; i<6; i++){
     setTimeout(()=>{
       console.log(i)
     },0)
   }

这是JS后来为新人开发者改变的一个东西。让代码按着新人的思路来实现。 出了上面这种方法能够实现打印0-5 那么还有其他方法吗?

可以通过自执行函数来实现

     for (var i = 0; i <= 5; i++) {
        !(function (j) {
          setTimeout(function print() {
            console.log(j);
          }, 0);
        })(i);
      }
  1. 通过setTimeout第三个参数
    for (var i = 0; i < 6; i++) {
        setTimeout((i) => console.log(i), 0, i);
      }

本文参考: 文章:我用了两个月的时间才理解 let

由于本人水平有限,如有描述不准确的地方请给我留言,欢迎交流~

本文为个人原创,转载请注明出处。