首页 > 其他分享 >函数自调用与闭包(详解)

函数自调用与闭包(详解)

时间:2022-10-30 05:11:05浏览次数:101  
标签:闭包 function 调用 console 函数 形参 详解 实参 log

一、函数

数的定义有两种:一为函数的声明、二为函数表达式-匿名函数

函数声明

1 function fn(){//需要函数名
2   console.log("函数声明");
3 }
4 fn()

函数表达式

1 const fs=function(){//需要定义变量接收
2         console.log("函数表达式");
3     }
4     console.log(fs);

 

函数自调用

自调用的函数一般是匿名函数 也就是说自调用时是函数的表达式

错误的写法

错误一

原因是js解析时,遇到function关键字被默认当成函数声明,而不是一个函数表达式,让后面的"();"变得孤立,从而产生语法错误。函数声明需要一个函数名,上面代码中函数没有函数名。要解决的就是让function () {console.log(111);}是一个函数表达式,而不是函数声明语句。

(function{//.......}) 是表达式----加个括号     function{//.......}

 

当js执行到(function {// code})();时, 由于(function {// code})是表达式, js会去对它求解得到返回值, 由于返回值是一 个函数, 故而遇到();时, 便会被执行。也可以表示为如下形式

var i = function(){ return 10; }();

正确的写法

一、最前面和最后加个小括号

1 // 没有参数的情况
2 (function () {
3     console.log(111);
4 }());
5  
6 // 有参数的情况
7 (function (形参1, 形参2) {
8     // 函数体
9 }(实参1, 实参2));

 

 

二、function外面加括号

1 //没有参数的情况
2 (function () {
3     console.log(222);
4 })();
5  
6 //有参数的情况
7 (function (形参1, 形参2) {
8     //函数体
9 })(实参1, 实参2);

 

 

 

三、最前面和最后面加上中括号

1 //没有参数的情况
2 [function () {
3     console.log(333);
4 }()];
5  
6 //有参数的情况
7 [function (形参1, 形参2) {
8     //函数体
9 }(实参1, 实参2)];

 

 

四、function前面加运算符,常用!、-、+

1 //没有参数的情况
2 !function () {
3     console.log(444);
4 }();
5  
6 //有参数的情况
7 !function (形参1, 形参2) {
8     //函数体
9 }(实参1, 实参2);

 

 

五、function前面加void

1 //没有参数的情况
2 void function () {
3     console.log(555);
4 }();
5  
6 //有参数的情况
7 void function (形参1, 形参2) {
8     //函数体
9 }(实参1, 实参2);

 

 

闭包

大函数里装着小函数 第一次调用大函数:返回小函数 第二次调用:执行返回的小函数的内部代码

变量的作用域分全局变量和局部变量,局部变量仅在函数内部使用
闭包的核心就是内部函数可以引用外部函数的参数和变量,通过返回函数来扩大函数的作用域

 

闭包传递参数

定义函数如下,定义obj变量时,传入参数,当obj()调用时,输出传入的参数  
1 function fun(x) {//函数声明方式
2         return function() {
3             console.log(x);
4         }
5     }
6     var obj = fun(4);
7     // 相当于  obj = function() {console.log(4)}
8     obj();  //执行 console.log(4)

都是两次调用 调用(返回出内部函数)-赋值-调用(返回出的函数)

事件闭包

倘若我们需要为每一个li添加click事件,点击li出现对应的序号

 

 

标签:闭包,function,调用,console,函数,形参,详解,实参,log
From: https://www.cnblogs.com/Jundd/p/16840412.html

相关文章

  • matlab调用C程序
    通过把耗时长的函数用c语言实现,并编译成mex函数可以加快执行速度。Matlab本身是不带c语言的编译器的,所以要求你的机器上已经安装有VC,BC或Watcom C中的一种。如果你在安......
  • Dockerfile构建镜像参数详解
    Dockerfile简介DockerFile是一个可以被Docker程序解释的文本文件,其中由指定的命令组成,在构建镜像的过程中,Docker程序会读取DockerFile文件内容并生成一个临时容器、然后在......
  • Barplot和boxplot作图详解——R语言
    当数据以简单的可视化的形式呈现时,数据便更具有意义并且更容易理解,因为人眼很难从原始数据中得出重要的信息。因此,数据可视化成为了解读数据最重要的方式之一。条形图和箱......
  • python调用微信公众号发布文章返回40097
    原因:data参数写法有误,应该将data参数包裹并json.dupms(data)处理;正确写法:importrequestsimportjsonurl="https://api.weixin.qq.com/cgi-bin/freepublish/batc......
  • Java中ServletContextListener监听器详解
    转载于http://www.51gjie.com/javaweb/875.htmlJava中ServletContextListener监听器详解ServletContextListener如果在web.xml中配置了这个监听器,那么启动容器时,就会默认......
  • python调用微信公众号发布文章返回40097
    原因:data参数写法有误,应该将data参数包裹并json.dupms(data)处理;正确写法:importrequestsimportjsonurl="https://api.weixin.qq.com/cgi-bin/freepublish/batc......
  • Plot函数用法详解——R语言
    plot是R中的基本画图工具,直接plot(x),x为一个数据集,就能画出图,soeasy!但是细节往往制胜的关键,所以就详细来看看plot的所有可设置参数及参数设置方法。R语言的基础绘图系统主......
  • python中for in的用法详解
    forin说明:也是循环结构的一种,经常用于遍历字符串、列表,元组,字典等格式:forxiny:循环体执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束。例1:遍历字符串s='......
  • 通过主动调用脱函数抽取类壳
    被动调用以自实现的抽取壳为例,对Test01.proc1函数进行抽空,但这次不同的是此Test01类在apk加载的过程中并不会被加载。通过之前被动调用的方式dumpdex发现此函数还是被抽......
  • 事件驱动(利用对应的事件来调用对应的函数)
    事件驱动(利用对应的事件来调用对应的函数)简单的一个dom操作获取对应的dom元素var变量=document.getElementById('对应的标签的id属性')给对应的变量添加点击事......