Javascript IIFE

165 阅读2分钟

现在正在学习Javascript基础知识 会遇到一些很有趣的东西,记录并和大家分享,如果你也感兴趣可以看看文章

函数声明与函数表达式

// 函数声明
function test() {}

// 函数表达式
var testExpre = function () {}
var testExp = function a () {}

解析:

  • Javascript中()为执行符
  • 函数名加小括号就可以执行对应的函数 test()
  • 两种函数表达是都可以用 等号左边的变量名称加小括号来执行函数 带有函数名称的函数名将会自动省略
  • 函数声明无法直接加() 函数表达式的变量名则可以

何为IIFE

An IIFE (Immediately Invoked Function Expression) is a JavaScript function that runs as soon as it is defined.

IIFE是一个在定义时就被执行的函数
// 第一种
(function() {
  // do somthing...
} ())

// 第二种
(function () {
  // do somthing...
})()

表达式是可以被立即执行的

1;
1 + 1;
1 > 3
1 && false
a = 1 + 2
// 这些都是表达式  都是可以在定义时就被程序执行的
一: 表达式是可以立即执行
二: 函数也有表达式的表示方式
如何让函数表达式立即执行呢?

函数表达式

var test = function() {}
// 想让函数表达式执行 直接加小括号啊
var test = function() {} ()

解析:

  • 上面是一个函数表达式
  • 想让函数执行就需要加() 又要立即执行

函数表达式的生成与转换

// js中的一元运算符可以把后续代码转化为表达式
!function(){......}();
~function(){.....}();
-function(){.....}();
+function(){......}();
1 && function(){......}();
0 || function(){......}();
 
// 用括号将代码块转化为表达式()
(function() {})()
//(function() {}) 为表达式 加()表达式立即执行

(function () {} ()) 
// 整体是表达式 内部的()让表达式执行  W3C推荐此写法

连续使用立即执行函数必须加分号;

(function() {console.log(111)} ())
(function() {console.log(222)} ())
/*
111
222
index.html:16 Uncaught TypeError: (intermediate value)(...) is not a function
    at index.html:16
*/
// 上面的函数会被解析成如下:
(function() {console.log(111)} ()) (function() {console.log(222)} ())
// 两个立即执行函数又组成了一个函数  无法解析

立即执行函数的优劣

    1. 不会污染全局变量
    1. 不需调用立即执行
    1. 与闭包结合生成私有变量
    1. 解决闭包变量引用问题
    1. 执行后立即销毁
    1. 代码的可读性变差

来一个面试题

点击li打印对应的下标

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Demo列表</title>
<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
    </ul>

    <script type="text/javascript">
        var oLi = document.querySelectorAll('li');
        for (var i = 0; i < oLi.length; i++) {
            // 每次点击都是5
            // oLi[i].onclick = function() {
            //     console.log(i);
            // }

            // 立刻执行函数包裹解决
            (function(j){
                oLi[j].onclick = function() {
                    console.log(j + 1);
                }
            })(i);
        }
    </script>
</body>
</html>

参考文档

medium.com/javascript-…
segmentfault.com/a/119000000…
dev.to/gyi2521/wha…
doc.liangxinghua.com/javascript/…

我的公众号