Skip to content

立即执行函数(IIFE) #76

@TieMuZhen

Description

@TieMuZhen

写法

立即执行函数习惯推荐写法在前面加

;(function(){
    ......
}()) // W3C推荐写法

或

;(function(){
    ......
})()

优点

自动执行完后立即释放内存

以下代码中的add函数一直存在于GO中,执行完后add也不释放

console.log(add(1, 1));

function add(a, b) {
    return a + b;
}

IIFE执行完后就释放了

const add = (function () {
    console.log(1);
}());
console.log(add); // undefined

如果想保留值,可以reture出去存在变量里

const add = (function (a, b) {
    return a + b;
}(1, 1));
console.log(add); // 2

拓展

一、当有多个函数的时候,以最后一个为准

const add = (
    function (a, b) {
        return a + b;
    },
    function (a, b) {
        return a - b;
    }
)(1, 1);
console.log(add); // 0

二、IIFE的函数名是被忽略的

var a = 10;
if(function b(){}) {  // 相当于 (function b(){}),所有b相当于没有,
    a += typeof b;
}
console.log(a); // 10undefined
!function b(){}
+function b(){}
-function b(){}
// 上面3个形式的IIFE都是一样的,b被忽略
console.log(b); // b is not defined

三、arguments

普通函数传参的arguments如下

function foo1(x){
    console.log(arguments); // 1, 2, 3, 4
    return x;
}
console.log(foo1(1, 2, 3, 4)); // 1

不是IIFE,不执行

function foo1(x){
    console.log(arguments);
    return x;
}(1, 2, 3, 4) // (1, 2, 3, 4)无意义

IIFE的arguments

(function foo(x){
    console.log(arguments); // 1, 2, 3, 4
    return x;
})(1, 2, 3, 4)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions