天天看点

【JS】立即调用函数表达式 IIFE 定义及三个使用场景【JS】立即调用函数表达式 IIFE 定义及三个使用场景

【JS】立即调用函数表达式 IIFE 定义及三个使用场景

文章目录

  • 【JS】立即调用函数表达式 IIFE 定义及三个使用场景
    • 定义
    • 使用场景
      • 防止变量污染
    • 给变量创建私有状态
    • 递归调用匿名函数

定义

IIFE(Immediately Invoked Function Expression)是立即调用函数表达式,它会定义一个方法并且立即调用该方法。

(function () {
    var message = "IIFE";
})();
           

当然,包含参数的方法也是可以的,前面的圆括号中是函数的定义,而后面的圆括号用来传参:

(function(val) {
    console.log(val)
})('IIFE');
           

使用场景

防止变量污染

将变量的作用范围控制在本地,而不污染全局上下文。

var loc = 'global'
function logger() {
    console.log(loc) // global
    console.log(window.loc) // global
}

(function() {
    var loc = 'global'
    function logger() {
        console.log(loc) // global
        console.log(window.loc) // undefined
    }
    logger()
}) ()
           

当然,现在许多框架已经帮你做好了这一步,但还是需要了解的。

给变量创建私有状态

最通俗的理解,可以看作java中的getter与setter。

let reference = (function() {
    let secret = 'this variable can not be changed by outter assignment'
    return {
        change(val) {
            secret = val
        }
        get secret() {
            return seret
        }
    }
}) ()
console.log(reference.secret) // this variable can not be changed by outter assignment
reference.change('changed')
console.log(reference.secret) // changed
           

递归调用匿名函数

匿名函数没有名字,可以通过IIFE来递归调用。

var charsInBody = (function counter(elm) {
    if (elm.nodeType == 3) { // 文本节点
        return elm.nodeValue.length;
    }
    var count = 0;
    for (var i = 0, child; child = elm.childNodes[i]; i++) {
        count += counter(child);
    }
    return count;
})(document.body);
           

继续阅读