JavaScript自行执行匿名函数有哪些好的用例?

时间:2014-04-17 03:26:11

标签: javascript theory

我理解自我执行的匿名函数是什么,但我无法理解我将使用它们的原因以及原因。这可能是因为我经常使用jQuery。能否提供一些好的用例示例?

2 个答案:

答案 0 :(得分:8)

基本上,自动执行的匿名函数(在技术上更简称为IIFE或立即调用的函数表达式)与声明命名函数然后立即调用它相同。与IIFE的唯一区别在于它没有名称,所以它只能在原地执行(不能从其他地方调用),因此不会为当前命名空间添加名称。

因此,您可以随时使用一个函数内部有一堆代码,并且只需要在当前定义的上下文中调用该代码。

一些常见的地方:

  1. 在任何涉及一些局部变量和一些异步操作(ajax,timeout等等)的循环中,您希望在异步完成函数中为每个循环迭代分别访问这些局部变量。 / p>

  2. 封装一些运行一次的顶级代码,使用它自己的范围和自己的私有局部变量,并与全局命名空间分开。

  3. 出于任何原因创建未命名的函数范围。

  4. 示例:

    循环索引(每次调用setTimeout()时单独冻结循环索引):

    for (var i = 0; i < max; i++) {
        // capture the loop index into in a closure
        (function(index) {
            setTimeout(function() {
                console.log(index);
            }, 2000);
        })(i);
    }
    

    顶级代码封装(创建不在全局范围内的私有但持久的变量):

    (function() {
        var cntr = 0;
        window.getUniqueId = function() {
            return ++cntr;
        };
    })();
    

    在代码中创建本地可用的快捷变量,否则这些快捷变量将成为顶级范围。

    function Dictionary(initialData) {
        // call parent constructor
        Set.apply(this, arguments);
    }
    
    (function() {
        // inherit from Set
        var proto = Dictionary.prototype = new Set();
        var base = Set.prototype;
        // Set constructor back to us
        proto.constructor = Dictionary;
    
        // override of the base class .add()
        // add(key, value)
        // add(Dictionary)
        // add({key1: value1, key2: value2})
        proto.add = function(arg1, arg2) {
            if (arg1 instanceof Set) {
                // call base class to just add another Set
                base.add.call(this, arg1);
            } else if (typeof arg1 === "object") {
                // cycle through the object and add all properties/values to the Set
                for (var prop in arg1) {
                    if (arg1.hasOwnProperty(prop)) {
                        this._add(prop, arg1[prop]);
                    }
                }
            } else if (typeof arg2 !== "undefined") {
                // must be add(key, value)
                this._add(arg1, arg2);
            }
            return this;
        }
    
        proto.get = function(key) {
            return this.data[key];
        }
    
        // See rest of code here: https://github.com/jfriend00/Javascript-Set/blob/master/dictionary.js
    
    })();
    

答案 1 :(得分:0)

您所指的是IIFE

它以几种常见方式使用:

  1. 它是自包含的,IIFE中任何声明的变量都不会污染全球空间。例: (function() { var foo = 123; $(".pop-up-trigger").click(function() { // ... }); }());
  2. 创建&#34;私有变量&#34;在JavaScript中。通过声明一些局部变量,然后返回一些函数,这些函数可以访问这些局部变量(分配它们或获取值)。在IIFE之外,没有代码可以触及那些局部变量,因此它们是私有的。

  3. 创建范围。 JavaScript没有块范围,但只有函数范围,因此通过创建函数并调用它,可以创建一个新的范围。