匿名函数详解

201 阅读1分钟
<script>
  /* 1. 匿名函数定义:没有名字的函数 (注意一个页面只允许一个立即执行匿名函数) */
  // 声明一个普通函数, 函数的名字叫fn
  function fn() {
    console.log(1);
  }
  // 然后将函数的名字去掉就是匿名函数
  // function () {
  //   console.log(2);
  // }
  // 到此,你会发现单独运行一个匿名函数,由于不符合语法要求,报错啦!解决方法只需要给匿名函数包裹一个括号即可:
  //匿名函数在其它应用场景括号可以省略
  // (function () {
  //   // 由于没有执行该匿名函数 所以不会执行匿名函数体内的语句
  //   console.log(3);
  // })
  // 如果需要执行匿名函数 在匿名函数后面加上一个括号即可立即执行
  // (function () {
  //   console.log('立即执行匿名函数');
  // })()
  // 传值 的话 参数直接写到括号里
  // (function (str) {
  //   console.log(str + "吧");
  // })('网')

  /* 2.匿名函数的应用场景 */
  // 2-1. 事件
  const sub = document.querySelector('#sub')
  sub.onclick = function () {
    alert('我被点击了!')
  }
  // 2-2. 对象
  const obj = {
    name: '网吧',
    age: 11,
    fn: function () {
      return `我叫${this.name}, 今年${this.age}岁!`
    }
  }
  console.log(obj.fn());
  // 2-3. 函数表达式
  // 将匿名函数赋值给变量fn
  const fun = function () {
    return "我是一只小小小小留下,怎么飞也飞不高!"
  }
  //调用方式与调用普通函数一样
  console.log(fun());
  // 2-4. 回调函数
  setInterval(function () {
    console.log("我其实是一个回调函数,每次1秒钟会被执行一次");
  }, 1000)
  // 2-5 返回值
  // 将匿名函数作为返回值
  function fn() {
    return function () {
      return '网啊是啥!'
    }
  }
  const box = fn()
  console.log(box());

  // 2-6 模仿块级作用域

  // 块级作用域, 有的地方称为私有作用域。 JavaScript中是没有块级作用域的, 例如:

  if (1 == 1) { //条件成立,执行if代码块语句。
    var a = 12; //a为全局变量
  }

  console.log(a); //12

  for (var i = 0; i < 3; i++) {
    console.log(i);
  }

  console.log(i); //4

  // if(){}for(){} 等没有自己的作用域。如果有,出了自己的作用域,声明的变量就会立即被销毁了。但是咱们可以通过匿名函数来模拟块级作用域:
  (function () {
    //这里是我们的块级作用域(私有作用域)
  })();

  // 尝试块级作用域:

  function fn() {
    (function () {
      var la = "啦啦啦!";
    })();
    console.log(la); //报错---la is not defined
  }
  fn();

  /* 
  匿名函数的作用:

1、通过匿名函数可以实现闭包,关于闭包在后面的文章中会重点讲解。在这里简单介绍一下:
  闭包是可以访问在函数作用域内定义的变量的函数。若要创建一个闭包,往往都需要用到匿名函数。

2、模拟块级作用域,减少全局变量。执行完匿名函数,存储在内存中相对应的变量会被销毁,从而节省内存。
    再者,在大型多人开发的项目中,使用块级作用域,会大大降低命名冲突的问题,从而避免产生灾难性的后果。自此开发者再也不必担心搞乱全局作用域了
  */
</script>