Javascript 的匿名函数与自执行

    技术2022-07-11  74

    javascript自执行函数

    函数的定义:

    第一种:函数声明

    alert(sum(1,2)); function sum(num1,num2){ return num1+num2; }

    ps:由于存在函数声明提前,代码不会报错。而采用函数表达式的形式会报错。 第二种:函数表达式

    var sum=function (num1,num2){ return num1+num2; }

    注意“=”右边的函数就是一个匿名函数,创造完毕函数后,又将该函数赋给了变量sum,sum的本质就是个函数。

    匿名函数的创建:

    第一种方式:就是上面所讲的定义sum函数,这也是最常用的方式之一。

    第二种方式:

    (function(x, y){ alert(x + y); })(2, 3);

    这里创建了一个匿名函数(在第一个括号内),第二个括号用于调用该匿名函数,并传入参数。

    自执行的匿名函数

    1.定义

    IIFE( 立即调用函数表达式)是一个在定义时就会立即执行的 JavaScript 函数。 ,这是一个被称为 自执行匿名函数 的设计模式,主要包含两部分。第一部分是包围在 圆括号运算符 () 里的一个匿名函数,使用函数表达式定义该函数(函数声明不能起作用),这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。 第二部分再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。自执行函数被执行引擎以同步的方式立即执行了,所以当你在之后的代码访问这个变量的时候可以直接返回给你计算后的筛选结果了。

    2.功能

    它可以帮你封装大量的工作而不会在背后遗留任何全局变量。 你定义的所有变量都会成员立即执行函数的局部变量,所以你不用担心这些临时变量会污染全局空间.可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量。

    3.注意点

    立即执行函数通常作为一个单独模块使用。一般没有问题,但是,建议在自己写的立即执行函数前加分号,这样可以有效地与前面代码进行隔离。否则,可能出现意想不到的错误。

    4.写法

    1.最前最后加括号

    (function(){alert(1);}());

    JSLINT推荐这种写法

    2.function外面加括号

    (function(){alert(1);})();

    目前很多比较好的js library 使用的都是第二种方式。

    3.function前面加运算符,常见的是void操作符,~操作符,!操作符

    !function(){alert(1);}(); void function(){alert(2);}();

    在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,

    5.疑惑

    为什么(function (){// code})();可以被执行, 而function() {// code}();却会报错? (1). 首先, 要清楚两者的区别: (function () {// code})是表达式, function () {// code}是函数声明. (2). 当js执行到function() {//code}();时, 由于function() {//code}在"预编译"阶段已经被解释过, js会跳过function(){//code}, 试图去执行();, 故会报错; 当js执行到(function (){// code})();时, 由于(function () {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行.

    6.匿名函数与闭包?未完待续

    Processed: 0.026, SQL: 10