立即执行函数表达式

立即执行函数表达式,大部分人也称为自执行函数。

自执行函数的写法

匿名函数
(function() {console.log(2)
})()
具名函数
(function log() {console.log(2)
})
自执行函数的传参
(function add(a, b) {console.log(a + b)
})(1, 2)
返回值
let fn = (function add(a, b) {return a + b;
}) (2, 4)console.log(fn)
自执行函数也可以传递函数作为参数
var a =2;(function log(fn) {fn(window)
})(function fn(global) {var a = 3;console.log(a); // 3console.log(global.a); // 2
})

立即执行函数有什么用?

只有一个作用:创建一个独立的作用域。

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

以一个著名的面试题为例:

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。

为什么还要用另一对括号把匿名函数包起来呢?

其实是为了兼容 JS 的语法。

如果我们不加另一对括号,直接写成

【JS基础】立即执行函数表达式(自执行函数)相关推荐

  1. JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  2. 函数声明、函数表达式、匿名函数、立即执行函数

    函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...

  3. 逆推继承看原型 函数的角色 函数声明和函数表达式的区别 函数中this指向的问题

    逆推继承看原型 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

  4. matlab已知函数表达式画函数图像,怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的……...

    点击查看怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的--具体信息 答:要具体哦,如果一个自变量,函数图像就是曲线,用plot 如果是2个自变量,函数图像就是曲面了,如f=3*exp ...

  5. 函数表达式与命名函数区别

    函数表达式: 1.把一个函数赋值给一个变量,叫做函数表达式 2.var 变量名 = 匿名函数; 3.函数表达式中,匿名函数后一定要有";"分号 4.变量名+()括号 即调用了函数 ...

  6. JS一起学01:css复习、js基础知识、事件、参数、函数、网页换肤、if判断、className问题、浏览器执行顺序

    一.html/css 1. 什么是盒子模型?     padding+border+width/height 2. float 浮动 (1)浮动的特性         脱离文档流         行内 ...

  7. 关于函数表达式的标识符/函数名

    函数的标识符也就是通常说的函数名,在函数声明中不可省略,而函数表达式中可以省略. 我们都知道,javascript引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量提升一 ...

  8. matlab 中调用s函数表达式,[求助]S函数中能否调用M函数

    [求助]S函数中能否调用M函数 我现在写了一个S-FUNCTION 里面调用了一些M函数,当把S函数的名字写入S-FUNCTION块的时候 总是出现 ??? SWITCH expression mus ...

  9. JS进阶之---函数,立即执行函数

    一.函数 函数声明.函数表达式.匿名函数 函数声明:使用function关键字声明一个函数,再指定一个函数名,叫函数声明.function name () { - } 函数表达式:使用function ...

最新文章

  1. matlab 流程计算方法,吸波材料LLG公式计算复磁导率的过程及matlab程序
  2. redis 缓存过期默认时间_缓存的必知必会:一文搞懂Redis持久化和过期机制
  3. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题
  4. 在线项目管理软件leangoo 管理 技术支持
  5. boost::mp11::mp_transform相关用法的测试程序
  6. 起底方舟编译器的引用计数!
  7. car-like robot与两轮差速驱动机器人异同分析
  8. JSP户外旅游网站系统myeclipse开发mysql数据库web结构计算机java编程
  9. ctf————逆向新手题8(logmein)WP
  10. MySQL之子查询优化
  11. 秋招(2014.9起)
  12. Python:语音处理,实现在线朗读RFC文档或本地文本文件
  13. 容器化与无状态微服务等
  14. 登录失败: 未知的用户名或错误密码。
  15. 中国定制家具行业深度调研及投资前景预测报告
  16. DSS 代码分析【服务器架构】
  17. 苹果内购IAP记录-2 StoreKit新版
  18. 深度linux系统任务栏毛玻璃,操作系统中常见的「毛玻璃」效果是怎么设计出来的?...
  19. bootBox 提示框插件
  20. 5000台机器的网吧配置

热门文章

  1. 邮件发送-JavaWeb
  2. 美国计算机有读一年的学校吗,美国哪些学校的计算机专业值得读?
  3. 静静默默,习惯一个人
  4. 【JqGrid】jqgrid合并单元格
  5. 云时代,有必要了解的华为云计算解决方案
  6. ps aux含义linux,Linux下ps aux解释
  7. K8S使用ceph-csi持久化存储之cephfs部署验证快照
  8. 【57期分享】4款毕业答辩PPT模板免费下载
  9. psv登陆商店显示服务器,psv云服务器
  10. android 相册分组,Android获取相册路径