立即执行函数

一、立即执行函数的作用与写法

格式:()()

作用:创建一个独立的作用域。这个作用域里面的变量,外面访问不到(即避免了「变量污染」)。并且立即执行,执行一次后就销毁

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 
 9 </body>
10 </html>
11 <script>
12     //立即执行函数
13    /* function f() {
14 
15     };
16     f();*/

   //第一种写法 17 (function () { 18 console.log('hi') 19 })();

   //第二种写法
20 (function () { 21 console.log('hi') 22 }()); 23 24 /* function () { 25 console.log('hi') 26 } ();错误语法*/ 27 28 // 事件 dom操作 29 </script>

案例二

1 var liList = ul.getElementsByTagName('li')
2 for(var i=0; i<6; i++){
3   (function(j){
4     liList[j].onclick = function(){
5       alert(j) // 0、1、2、3、4、5
6     }
7   })(i)
8 }

 

二、立即执行函数与闭包的区别

1 for (var i = 0; i < 5; i++) {
2     (function (i) {
3         setTimeout(function () {
4             console.log(i);
5         }, 1000);
6     })(i);
7 }
8 console.log(i);

//依次输出 5 0 1 2 3 4 

因为for循环以后 i 就会变成 5,上面代码最后一行的输出将先执行,所以先输出 5。JS中调用函数传递参数都是值传递 ,所以当立即执行函数执行时,首先会把参数 i 的值复制一份,然后再创建函数作用域来执行函数,循环5次就会创建5个作用域,所以1秒后几乎会同时输出 0 1 2 3 4 。

 

立即执行函数和闭包没有什么关系,只是两者会经常结合在一起使用而已,但两者有本质的不同。

立即执行函数和闭包只是有一个共同优点就是能减少全局变量的使用。

立即执行函数只是函数的一种调用方式,只是声明完之后立即执行,这类函数一般都只是调用一次,调用完之后会立即销毁,不会占用内存。

闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但因被引用的内部变量不能被销毁,增大了内存消耗,使用不当易造成内存泄露。

总结:立即执行函数调用一次立即摧毁,闭包不会被销毁增加内存的消耗,二者都减少了全局变量的使用。

posted @ 2022-02-17 00:02  和尚爱吃肉111  阅读(142)  评论(0)    收藏  举报