Home Web Front-end JS Tutorial Anonymous functions and self-execution in Javascript

Anonymous functions and self-execution in Javascript

Oct 13, 2016 am 10:21 AM

The definition of functions can be roughly divided into three ways:

The first one: This is also the most conventional one

function double(x){    
    return 2 * x;       
}
Copy after login

The second one: This method uses the Function constructor, taking both the parameter list and the function body as String is very inconvenient and is not recommended to be used.

var double = new Function('x', 'return 2 * x;');
Copy after login

The third type:

var double = function(x) { return 2* x; }
Copy after login

Note that the function on the right side of "=" is an anonymous function. After creating the function, the function is assigned to the variable square.

Creation of anonymous functions

The first way: Define the square function as mentioned above, which is also one of the most commonly used ways.

Second way:

(function(x, y){   
    alert(x + y);     
})(2, 3);
Copy after login

An anonymous function is created here (inside the first bracket), and the second bracket is used to call the anonymous function and pass in the parameters. Parentheses are expressions, and expressions have return values, so you can add a pair of parentheses at the end to let them execute.

Self-executing anonymous function

1. What is a self-executing anonymous function?
It refers to a function that looks like this: (function {// code})();

2. Question
Why (function {// code})(); can be executed, while function {// code} (); but will report an error?

3. Analysis
(1). First of all, we must understand the difference between the two:
(function {// code}) is an expression, function {// code} is a function declaration.
(2). Secondly, the characteristics of js "precompilation":
In the "precompilation" stage, js will interpret function declarations, but ignore expressions.
(3). When js is executed to function() {// code}();, since function() {//code} has been interpreted in the "pre-compilation" stage, js will skip function(){//code} and try to execute ();, so an error will be reported ;
When js executes (function {// code})();, since (function {// code}) is an expression, js will solve it to get the return value. Since the return value is a function, When (); is encountered, it will be executed.

In addition, the method of converting a function into an expression does not necessarily rely on the grouping operator (). We can also use the void operator, ~ operator, ! operator... …

For example:

!function(){   
  alert("另类的匿名函数自执行");   
}();
Copy after login

Anonymous functions and closures

The English word for closure is closure, which is a very important part of knowledge in JavaScript, because using closures can greatly reduce the amount of our code and make our The code looks clearer, etc. In short, the function is very powerful.

The meaning of closure: To put it bluntly, closure is the nesting of functions. The inner function can use all the variables of the outer function, even if the outer function has been executed (this involves JavaScript scope chain).

function checkClosure(){  
    var str = 'rain-man';  
    setTimeout(  
        function(){ alert(str); } //这是一个匿名函数  
    , 2000);  
}  
checkClosure();
Copy after login

This example looks very simple. There are still many knowledge points after careful analysis of its execution process: the execution of the checkClosure function is instantaneous (maybe it only takes 0.00001 milliseconds), and a variable str is created in the function body of checkClosure. , str is not released after checkClosure is executed, because the anonymous function in setTimeout has a reference to str. After 2 seconds, the anonymous function in the function body is executed, and str is released.

Use closures to optimize code:

function forTimeout(x, y){  
    alert(x + y);  
}  
function delay(x , y  , time){  
    setTimeout('forTimeout(' +  x + ',' +  y + ')' , time);      
}  
/**  
 * 上面的delay函数十分难以阅读,也不容易编写,但如果使用闭包就可以让代码更加清晰  
 * function delay(x , y , time){  
 *     setTimeout(  
 *         function(){  
 *             forTimeout(x , y)   
 *         }            
 *     , time);     
 * }  
 */
Copy after login

The biggest use of anonymous functions is to create closures (this is one of the features of the JavaScript language), and you can also build namespaces to reduce the use of global variables.

var oEvent = {};  
(function(){   
    var addEvent = function(){ /*代码的实现省略了*/ };  
    function removeEvent(){}  
     
    oEvent.addEvent = addEvent;  
    oEvent.removeEvent = removeEvent;  
})();
Copy after login

In this code, the functions addEvent and removeEvent are local variables, but we can use it through the global variable oEvent, which greatly reduces the use of global variables and enhances the security of the web page. We want to use this code: oEvent.addEvent(document.getElementById('box'), 'click', function(){});

var rainman = (function(x , y){  
    return x + y;  
})(2 , 3);  
/**  
 * 也可以写成下面的形式,因为第一个括号只是帮助我们阅读,但是不推荐使用下面这种书写格式。  
 * var rainman = function(x , y){  
 *    return x + y;  
 * }(2 , 3);
Copy after login

Here we create a variable rainman and call the anonymous function directly Initialized to 5, this little trick is sometimes very useful.

var outer = null;  
     
(function(){  
    var one = 1;  
    function inner (){  
        one += 1;  
        alert(one);  
    }  
    outer = inner;  
})();  
     
outer();    //2  
outer();    //3  
outer();    //4
Copy after login

The variable one in this code is a local variable (because it is defined within a function), so it is not accessible from the outside. But here we created the inner function, which can access the variable one; and the global variable outer refers to inner, so calling outer three times will pop up the incremental result.

Note

1 The closure allows the inner function to reference the variable in the parent function, but the variable is the final value

/**  
 * <body>  
 * <ul>  
 *     <li>one</li>  
 *     <li>two</li>  
 *     <li>three</li>  
 *     <li>one</li>  
 * </ul>  
 */
     
var lists = document.getElementsByTagName(&#39;li&#39;);  
for(var i = 0 , len = lists.length ; i < len ; i++){  
    lists[ i ].onmouseover = function(){  
        alert(i);      
    };  
}
Copy after login

You will find that when the mouse moves over each

  • element, it always pops up 4, instead of the element subscript we were expecting. Why is this? It’s already mentioned in the notes (final value). Obviously this explanation is too simple. When the mouseover event calls the listening function, it first searches inside the anonymous function (function(){ alert(i); }) to see if i is defined. The result is that it is not defined; therefore, it will search upwards. The result is that it has been defined, and the value of i is 4 (the i value after the loop); therefore, in the end, 4 pops up every time.

    Solution one:

    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0 , len = lists.length ; i < len ; i++){  
        (function(index){  
            lists[ index ].onmouseover = function(){  
                alert(index);      
            };                      
        })(i);  
    }
    Copy after login

    Solution two:

    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0, len = lists.length; i < len; i++){  
        lists[ i ].$$index = i;    //通过在Dom元素上绑定$$index属性记录下标  
        lists[ i ].onmouseover = function(){  
            alert(this.$$index);      
        };  
    }
    Copy after login

    Solution three:

    function eventListener(list, index){  
        list.onmouseover = function(){  
            alert(index);  
        };  
    }  
    var lists = document.getElementsByTagName(&#39;li&#39;);  
    for(var i = 0 , len = lists.length ; i < len ; i++){  
        eventListener(lists[ i ] , i);  
    }
    Copy after login

    2 Memory leak

    Using closures can easily cause memory leaks in the browser. In serious cases, the browser will hang.


  • Statement of this Website
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

    Hot AI Tools

    Undresser.AI Undress

    Undresser.AI Undress

    AI-powered app for creating realistic nude photos

    AI Clothes Remover

    AI Clothes Remover

    Online AI tool for removing clothes from photos.

    Undress AI Tool

    Undress AI Tool

    Undress images for free

    Clothoff.io

    Clothoff.io

    AI clothes remover

    AI Hentai Generator

    AI Hentai Generator

    Generate AI Hentai for free.

    Hot Article

    R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
    2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
    Repo: How To Revive Teammates
    4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: How To Get Giant Seeds
    4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

    Hot Tools

    Notepad++7.3.1

    Notepad++7.3.1

    Easy-to-use and free code editor

    SublimeText3 Chinese version

    SublimeText3 Chinese version

    Chinese version, very easy to use

    Zend Studio 13.0.1

    Zend Studio 13.0.1

    Powerful PHP integrated development environment

    Dreamweaver CS6

    Dreamweaver CS6

    Visual web development tools

    SublimeText3 Mac version

    SublimeText3 Mac version

    God-level code editing software (SublimeText3)

    Replace String Characters in JavaScript Replace String Characters in JavaScript Mar 11, 2025 am 12:07 AM

    Detailed explanation of JavaScript string replacement method and FAQ This article will explore two ways to replace string characters in JavaScript: internal JavaScript code and internal HTML for web pages. Replace string inside JavaScript code The most direct way is to use the replace() method: str = str.replace("find","replace"); This method replaces only the first match. To replace all matches, use a regular expression and add the global flag g: str = str.replace(/fi

    Custom Google Search API Setup Tutorial Custom Google Search API Setup Tutorial Mar 04, 2025 am 01:06 AM

    This tutorial shows you how to integrate a custom Google Search API into your blog or website, offering a more refined search experience than standard WordPress theme search functions. It's surprisingly easy! You'll be able to restrict searches to y

    Build Your Own AJAX Web Applications Build Your Own AJAX Web Applications Mar 09, 2025 am 12:11 AM

    So here you are, ready to learn all about this thing called AJAX. But, what exactly is it? The term AJAX refers to a loose grouping of technologies that are used to create dynamic, interactive web content. The term AJAX, originally coined by Jesse J

    Example Colors JSON File Example Colors JSON File Mar 03, 2025 am 12:35 AM

    This article series was rewritten in mid 2017 with up-to-date information and fresh examples. In this JSON example, we will look at how we can store simple values in a file using JSON format. Using the key-value pair notation, we can store any kind

    8 Stunning jQuery Page Layout Plugins 8 Stunning jQuery Page Layout Plugins Mar 06, 2025 am 12:48 AM

    Leverage jQuery for Effortless Web Page Layouts: 8 Essential Plugins jQuery simplifies web page layout significantly. This article highlights eight powerful jQuery plugins that streamline the process, particularly useful for manual website creation

    What is 'this' in JavaScript? What is 'this' in JavaScript? Mar 04, 2025 am 01:15 AM

    Core points This in JavaScript usually refers to an object that "owns" the method, but it depends on how the function is called. When there is no current object, this refers to the global object. In a web browser, it is represented by window. When calling a function, this maintains the global object; but when calling an object constructor or any of its methods, this refers to an instance of the object. You can change the context of this using methods such as call(), apply(), and bind(). These methods call the function using the given this value and parameters. JavaScript is an excellent programming language. A few years ago, this sentence was

    Improve Your jQuery Knowledge with the Source Viewer Improve Your jQuery Knowledge with the Source Viewer Mar 05, 2025 am 12:54 AM

    jQuery is a great JavaScript framework. However, as with any library, sometimes it’s necessary to get under the hood to discover what’s going on. Perhaps it’s because you’re tracing a bug or are just curious about how jQuery achieves a particular UI

    10 Mobile Cheat Sheets for Mobile Development 10 Mobile Cheat Sheets for Mobile Development Mar 05, 2025 am 12:43 AM

    This post compiles helpful cheat sheets, reference guides, quick recipes, and code snippets for Android, Blackberry, and iPhone app development. No developer should be without them! Touch Gesture Reference Guide (PDF) A valuable resource for desig

    See all articles