
本文共 869 字,大约阅读时间需要 2 分钟。
(function () { /* code */ } ()); // W3C推荐使用这个(function () { /* code */ })(); // 但是这个也是可以用的
立即执行函数:函数执行过后立即被销毁。
由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的;
只要记住一点,匿名函数前面加的任何运算符、操作符都不起运算和操作作用,而只是为了把匿名函数包装成一个表达式执行!!!
只有表达式才能被执行符号执行,能被执行符号执行的表达式,函数名字会被自动忽略。
立即执行函数的作用是:
1.创建一个独立的作用域,这个作用域里面的变量,外面访问不到,这样就可以避免变量污染。
2.闭包和私有数据。提到闭包,不得不提下那道经典的闭包问题。
- 这是第一条
- 这是第二条
- 这是第三条
很多人觉得这样的执行效果是点击第一个li,则会输出1,点击第二个li,则会输出二,以此类推。但是真正的执行效果是,不管点击第几个li,都会输出3。因为 i 是贯穿整个作用域的,而不是给每个 li 分配了一个 i,用户触发的onclick事件之前,for循环已经执行结束了,而for循环执行完的时候i=3。
但是如果我们用了立即执行函数给每个 li 创造一个独立作用域,就可以改写为下面的这样,这样就能实现点击第几条就能输出几的功能。
在立即执行函数执行的时候,i 的值被赋值给 ii,此后 ii 的值一直不变。i 的值从 0 变化到 3,对应3 个立即执行函数,这 3个立即执行函数里面的 ii 「分别」是 0、1、2。
其实ES6语法中的let也可以实现上述的功能,仅仅是将for循环中的var换成let,如下所示,有木有觉得很简单明了。
那很多人就觉得用let可以完全取代立即执行函数,到目前为止,可能是我眼界所限制,我所能用到的立即执行函数的确能被let替代,前提是你的运行环境(包括旧的浏览器)支持ES2015。如果不支持,你将不得不求助于以前经典的函数。
发表评论
最新留言
关于作者
