关于自执行函数(立即执行函数)

2017-04-26  本文已影响0人  aermin

tips:接下去会在github写博客,简书不再更新和修改文章,欢迎大家逛逛我的新博客点击查看 ,我会尽量用更容易理解的方式写好每一篇博客,大家一起学习交流😄。

什么是自执行函数?

一下有三种写法

1.最前最后加括号

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

这种方法好处是能提醒阅读代码的人,这段代码是一个整体。 坏处是前面的代码行后记得加分号,不然会报错。如:

var a=1 
(function(){alert(1);}()); 

2.function外面加括号

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

这种做法比方法1少了一个代码整体性的好处.

3.function前面加运算符,常见的是!与void 。

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

显然,加上“!”或“+”等运算符,写起来是最简单的。加上“void ”要敲五下键盘,但是听说有一个好处是,比加"!"少一次逻辑运算。

网上的图

自执行函数的作用

创建一个独立的作用域,这个作用域里面的变量,外面访问不到(即避免「变量污染」)

例子来看一个著名的面试题:

var liList = ul.getElementsByTagName('li')
for(var i=0; i<6; i++){
  liList[i].onclick = function(){
    alert(i) // 为什么 alert 出来的总是6,而不是0、1、2、3、4、5
  }
}

为什么 alert 的总是 6 呢?

因为 i 是贯穿整个作用域的,而不是给每个li 分配了一个i,如下:

也是网上的图

那么怎么解决这个问题呢?

用立即执行函数给每个li创造一个独立作用域即可(当然还有其他办法):

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

在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。i 的值从 0 变化到 5,对应 6 个立即执行函数,这 6 个立即执行函数里面的 ii 「分别」是 0、1、2、3、4、5。

(整理自网络)

上一篇 下一篇

猜你喜欢

热点阅读