是什么?

  • 立即执行函数就是
    • 声明一个匿名函数
    • 马上调用这个匿名函数 ```javascript ( function(){alert(‘匿名函数’)} )()

// 1. function(){alert(‘匿名函数’)} 声明一个匿名函数 // 2. ( function(){alert(‘匿名函数’)} ) 用括号包起来 // 3. ( function(){alert(‘匿名函数’)} )() 调用他

  1. - 一定要用括号包起来,为了兼容 JS 的语法。否则会报错
  2. <a name="RT3wu"></a>
  3. ## 什么用?
  4. - 立即执行函数作用是
  5. - 创建一个独立的作用域。
  6. - 这个作用域里面的变量,外面访问不到(可以避免「变量污染」)。
  7. ```javascript
  8. var liList = ul.getElementsByTagName('li')
  9. for(var i=0; i<6; i++){ //进行 for 循环
  10. liList[i].onclick = function(){
  11. alert(i) // 为什么 alert 出来的总是 6,而不是 0、1、2、3、4、5
  12. }
  13. }
  • 为什么 alert 出来的总是 6,而不是 0、1、2、3、4、5 ?

    • 因为 i 是贯穿整个作用域的,而不是给每个 li 分配了一个 i
    • for 循环完后 i 的值为 6
    • 用户一定是在 for 循环完后,才进行点击的 , 此时 i 的值为 6

      使用立即执行函数

  • 立即执行函数给每个 li 创造一个独立作用域 , 可以让 alert 出来的是 0、1、2、3、4、5 ```javascript 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 ,然后调用那个匿名函数

} ```

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