12.立即执行函数

立即执行函数

  • 在开发中应尽量减少直接在全局作用域中编写代码!
  • 所以我们的代码要尽量编写在局部作用域中
  • 如果let声明的变量,可以使用{}来创建块作用域

1. 在编写程序时同时也不能忽视var声明,但由于var没有块作用域该如何声明var类型的局部变量呢?

        {
            var a = 10
        }
        {
            var a = 20
        }
        console.log(a); //20,两个a都是全局变量

2. 虽然var没有块作用域,但是它有函数作用域。

  • 但这样写也还是有问题,我们只需要一个a变量而下面这种方式要主动调用函数才能生成a变量,而且调多了可能创建两遍。
  • 再有函数也有函数名,也是全局变量,也容易被覆盖。
  • 这种方式可行,但是不完美。
        function fn1() {
            var a = 10
        }
        fn1() //调用函数,创建局部变量a
        function fn2() {
            var a = 20
        }
        fn2() //调用函数,创建局部变量a

3. 我们希望创建一个只执行一次,并且匿名的函数(立即执行函数-IIFE)

  • 立即执行函数是一个匿名函数,并且只会调用一次
  • 可以利用IIFE创建一个一次性的函数作用域,避免变量冲突的问题
  • 立即执行函数书写时必须手动在末尾加个;,不然编译器会解析成(xxx)(xxx)前者会被当成函数调用,然而它并不是,浏览器会报错。
  • 立即执行函数只防止意外被修改的情况,你要是诚心在立即执行函数体中修改那也是没办法。
    //由于是function开头的函数,会被提前执行,执行必须要有函数名,不然会报错。(希望创建匿名函数)
    //想办法不让它提前执行,给它用()括起来。此时它就是一个函数对象
    //调用函数,函数对象+(),所以直接在整体后面加个()完成调用
    (function () { //写法一
        var a = 10
     })();//这里的分号必须加上

    (function () { //写法二
        var a = 10
     }());

 

posted @ 2022-11-10 15:57  莫扎特03  阅读(26)  评论(0编辑  收藏  举报