JavaScript起步(十)| 一起学系列

66 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

  • 变量声明提升

    • 在预解析过程中,所有定义的变量,都会将声明的过程提升到所在作用域最上面,在将来的代码执行过程中,按照先后顺序会先执行被提升的声明变量过程

    • 提升过程中,只提升声明过程,不提升变量赋值,相当于变量定义未赋值,变量内存储undefined值

    • 因此,在js中会出现一种现象,在前面调用后定义的变量,不会报错,只会使用undefined值 image.png

    • 函数声明提升与变量声明提升同理,但是函数提升是整个函数,不只是声明。在js中会出现一种现象,在前面调用后定义的函数,不会报错,而且能正常执行函数内部的代码

    • 提升顺序

      • 预解析过程中,先提升var变量声明,再提升function函数声明

      • 假设出现变量名和函数名相同,那么后提升的函数名标识符会覆盖先提升的变量名,那么在后续代码中出现调用标识符时,内部是函数的定义过程,而不是undefined

      • 如果调用标识符的过程在源代码函数和变量定义后面,相当于函数名覆盖了一次变量名,结果在执行到变量赋值时,又被新值覆盖了函数的值,那么在后面再次调用标识符,用的就是变量存的新值

      • 建议:不要用相同的标识符给变量名或函数名,避免出现覆盖 image.png 输出结果会报错,因为虽然函数声明会覆盖变量声明,但是后面又重新给变量赋值为字符串,再调用时,就不是函数了,而是一个变量

  • 函数表达式的提升

    • 在预解析过程中,函数表达式进行的是变量声明提升,而不是函数声明提升。提升后变量内部存的是一个undefined。在前面进行函数方法调用,数据类型会提示错误

    • 建议:定义函数时,最好使用function关键字定义方式,这样函数声明个提升到可以永远生效

    • 工作应用的建议:函数声明提升可以用于调整代码顺序,将大段的定义过程放到代码最后,但是不影响执行效果

  • IIFE自调用函数

    • IIFE:immediately-invoked function expression,叫做即时调用的函数表达式,也叫做自调用函数,表示函数在定义时就立即调用

    • 函数调用方式:函数名或函数表达式的变量名后面加()运算符

    • 函数名定义的形式不能实现立即执行自调用,函数使用函数表达式可以实现立即执行,原因是因为函数表达式定义过程中,将一个函数矮化成了一个表达式,后面加()运算符就可以立即执行

    • 启发:如果想实现IIFE,可以想办法将函数矮化成表达式

    • 函数矮化成表达式

      • 数字运算符:+-();逻辑运算符:!非运算

      • IIFE结构可以关住函数的作用域,在结构外面是不能调用函数的

      • IIFE最常用的是()运算符,而却函数可以不写函数名,使用匿名函数 image.png 最常用的是使用小括号进行矮化 image.png 外层的无法使用变量a