Web前端:什么是匿名函数?

    作者:小小_先森更新于: 2020-02-26 14:39:50

    Web开发

      匿名函数它是matlab中定义的一种函数形式,出现在matlab中,匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内通过指令直接生成。

      闭包是ECMAScript(Javascript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下。如果想要扬长避短地使用闭包这一特性,则必须了解它们的工作机制。而闭包工作机制的实现很大程度上有赖于标识符(或者说对象属性)解析过程中作用域的角色。

      匿名函数顾名思义就是没有名字的函数,通常我们所写的函数都是这样的:

      1functiondo(){

      2//执行代码

      3};

      4

      5//调用

      6do();

      这种写法是定义了一个名为do的函数,并通过函数名称进行调用。

      那如果没有名字是什么样子的啊?

      1function(){

      2//执行代码

      3};

      这一种写法在编译的时候会报错:

      UncaughtSyntaxError:Unexpectedtoken(

      这是为什么呢?原来是因为浏览器在进行语法分析的时候发现这个函数根本就没有办法可以执行。

      那问题就来了,为什么还要匿名函数呢?在编程语言中如果又个编码方式那这种编码方式肯定是能正常运行的,那该如何让匿名函数跑起来呢?再看下面的示范例子:

      vardo=function(){

      //执行代码

      }

      do();

      这种函数大家肯定都知道,其实这种写法就是将匿名函数复制为变量do,再通过变量名执行函数。

      (function(){

      //执行代码

      console.log("打印成功");

      })();

      那么大家知道上面的编程代码是什么意思呢?

      可以先把上面的代码分几个部分:

      第一部分是括号里面的匿名函数,第二部分是加上括号的匿名函数,第三部分带上最后面执行用的括号。

      匿名函数在括号内部可以看成是将匿名函数当成是一个变量,再通过括号进行执行。

      (function(){

      //执行代码

      })();

      //相当于

      vardo=function(){

      //执行代码

      };

      do();

      其实向上面这种匿名函数的写法在很多地方都有用到,这种又叫自执行函数,像jQuery等一些工具包都会用这种写法,自执行函数有哪些优点呢?

      1//定义一个全局变量a

      2vara=1;

      3

      4(function(){

      5//在自执行函数中也创建一个变量a

      6vara=2;

      7console.log(a);//2

      8})();

      9

      10console.log(a);//1

      可以看到在自执行函数中打印出来的是2,而在自执行函数中打印出来的是1;

      那么问题就来了,这是为什么呢?

      原来是因为在程序中有个名称叫做作用域,全局环境的作用域叫做全局作用域,函数中的作用域叫做函数作用域,而作用域是分层的,内部作用域中可以访问外部作用域中的变量,而外部作用域中却不可以访问内部作用域中的变量。

      在内部作用域中访问变量会先在自己所在作用域中查找,假如说找不到再在上一层作用域中进行查找,再找不到还会再往上查找,一直到找到全局作用域。这种一层一层的关系像链条一样所以被叫做作用域链。

      再看上面编程代码:在自执行函数中console.log函数访问了a变量,首先在自己所在的作用域中查找,找到了a变量,故输出了a的值2;全局环境中的console.log函数也访问了a变量,由于外部作用域不能访问内部作用域,所以全局环境中访问的a变量只能在全局函环境中进行查找,所以输出了a的值1;

      小编总结:匿名函数的作用主要是实现自己定义matlab中的函数,从而扩大函数的使用功能。自执行函数的优点是为了保证自执行函数中的变量不会受到其他环境的污染。

课课家教育

未登录

1