JavaScript executes the function immediately

Ten years in the world 2021-01-21 16:46:12
javascript executes function immediately


Immediate execution function , seeing the name of a thing one thinks of its function , Functions that are executed immediately after creation . In practice , Executing a function immediately is not a required Syntax , But one advantage of using immediate execution functions is that they simplify the code .

Execute function syntax immediately

stay JavaScript The syntax of a common function definition in is as follows :

function foo() {
console.log(123);
}

If you want to call this function , Then we'll do it :

foo();

If you change it to a function that executes immediately, it's like this :

(function foo() {
console.log(123);
}());

Or something like that :

(function foo() {
console.log(123);
})();

The above two immediate functions are equivalent to Function declaration + Function call . A normal function declaration needs to use function keyword , Function calls need to use the function name with a parenthesis (foo()). We know that function names actually hold references to functions , therefore foo Variables are saved foo Reference to function body , So theoretically, the immediate execution function can be written like this :

function foo() {
console.log(123);
}();

But if you write like this ,JavaScript The interpreter will report SyntaxError Grammar mistakes . So we need to use a bracket to enclose the whole function and then call it . The brackets used to call a function can be written inside or outside the brackets that enclose the function , There is no difference between the two , Choose a writing that you can accept better .

Immediate execution function features

There is little difference between an immediate function and a normal function , It can receive parameters 、 There can also be return values , But there is a very different thing between them , It is to execute the function immediately and destroy it immediately after execution .

We defined one above foo function , If you want to do it many times , So just call it multiple times foo() that will do :

function foo() {
console.log(123);
}
foo();
foo();
foo();

however , If the function is executed immediately , Multiple calls foo() Will get exception .

(function foo() {
console.log(123);
})();
foo(); // ReferenceError: foo is not defined

You can see that on the second call foo() Function time , You'll get foo is not defined. namely foo The function has actually been destroyed . So when we define functions that execute immediately , You don't usually need to specify a function name , Define an anonymous function :

(function () {
console.log(123);
})();

Immediate execution of function usage scenarios

Execute the function immediately and it will be destroyed once , So if we define a function that is executed only once, we can replace it with an immediate function .

Two common scenarios for executing functions immediately are :

  1. Data initialization
  2. Solve the problem of referring to loop variables in closures

Data initialization is easy to understand , If you want to calculate num Value :

var num = (function (a, b) {
return a + b;
})(1, 2);

As for how to solve the problem of referring to loop variables in closures , We need to look at a slightly more complicated example :

function foo() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push(function bar() {
return i * i;
});
}
return arr;
}
var result = foo();
result[0](); // 9
result[1](); // 9
result[2](); // 9

In the above example code , In a closure bar Function refers to its external loop variable i, What we expected was 014, But in fact, the end result is 9.

The reason for this problem is for Loop does not have independent block level scope , At this point, you can use the immediate execution function to solve this problem .

function foo() {
var arr = [];
for (var i = 0; i < 3; i++) {
arr.push((function (j) {
return function bar() {
return j * j;
}
})(i));
}
return arr;
}
var result = foo();
result[0](); // 0
result[1](); // 1
result[2](); // 4

We are bar The exterior of a function , Defines an immediate execution function , such , In each cycle , The current loop variable i All of the values are passed to the inside of the function j Variable , So we can get the results we want .

In fact, there is a simpler solution , The loop variable will be declared directly i Key words of var Change it to let It can also achieve the same effect , Readers can try it on their own .

Perform function exploration now , Try carefully

I gave an example above of initializing data using an immediate function :

var num = (function (a, b) {
return a + b;
})(1, 2);

In fact, this way of writing does not use parentheses to wrap functions :

var num = function (a, b) {
return a + b;
}(1, 2);

You can also get the right results , also JavaScript The interpreter did not report an error .

actually , When performing assignment operations , The above code has become an expression , and JavaScript The interpreter thinks that Function expression It can be executed directly .

So the following code can also be executed correctly :

+function () {
console.log(123);
}();
-function () {
console.log(123);
}();

Notice the +- Representative is 、 negative , It's not to add 、 reduce .JavaScript There are quite a few of these ways of writing , It's not recommended to use it in practical work , For entertainment only .

The starting address : https://jianghushinian.cn/
版权声明
本文为[Ten years in the world]所创,转载请带上原文链接,感谢
https://javamana.com/2021/01/20210121164213308r.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云