用匿名函数定义函数_c语言最先执行的函数是

用匿名函数定义函数_c语言最先执行的函数是深入理解 函数、匿名函数、自执行匿名函数

大家好,又见面了,我是你们的朋友全栈君。

1.基础概念:定义函数的方式

一般定义函数有两种方式:

  1. 函数的声明
  2. 函数表达式

1.1函数的声明

如下方法 add 就是函数声明的代码结构:

function add(x,y){  
   alert(x+y) 
}  
add(1,2) //弹窗显示:3 复制代码

关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。这意味着可以把函数声明放在调用它的语句之后。如下代码可以正确执行:

add(1,2); //弹窗显示:3  
function add(x,y){  
    alert(x+y) 
}  
复制代码

1.2函数表达式

函数表达式中有几种不同的语法。最常见和最具代表性的一种如下所示:

var add = function(x,y){  
    alert(x+y) 
}
add(1,2) //弹窗显示:3
复制代码

这种形式看起来好像是常规的变量赋值语句。但是函数表达式和函数声明的区别在于,函数表达式在使用前必须先赋值。所以这段代码执行的时候就会出错:

add(1,2) //无弹窗,报错: add is not a function  
var add = function(x,y){  
    alert(x+y)  
} 
复制代码

造成这种现象是因为解析器在向执行环境中加载数据时,解析器会率先读取函数声明,并使其在执行任何代码前可用;至于函数表达式,则必须等到解析器执行到它的所在的的代码行,才会真正的被解析。函数表达式中,创建的函数叫做匿名函数,因为function关键字后面没有标识符。

2.匿名函数的调用方式

匿名函数,顾名思义就是没有名字的函数。上面的函数表达式中的创建,实际上是创建一个匿名函数,并将匿名函数赋值给变量 add,用 add 来进行函数的调用,调用的方式就是在变量 add 后面加上一对括号(),如果有参数传入的话就是 add(1,2),这就是匿名函数的一种调用方式。

还有一种匿名函数的调用方式是:使用()将匿名函数括起来,然后后面再加一对小括号(包含参数列表)。我们再看一下以下一个例子:

alert((function(x,y){
    
    return x+y;})(2,3)) //弹窗提示5  
alert((new Function("x","y","return x+y"))(2,3)) //弹窗显示5  
复制代码

在javascript中,是没有块级作用域这种说法的,以上代码的这种方式就是模仿了块级作用域(通常成为私有作用域),语法如下所示:

(function(){  
    //这里是块级作用域  
})();  
复制代码

以上代码定义并立即调用了一个匿名函数。经函数声明包含在一对圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。然而要注意一点:

function(){  
      
}();  
复制代码

上面的代码是错误的,因为Javascript将function关键字当作一个函数声明的开始,而函数声明后面不能加圆括号,如果你不显示告诉编译器,它会默认生成一个缺少名字的function,并且抛出一个语法错误,因为function声明需要一个名字。有趣的是,即便你为上面那个错误的代码加上一个名字,他也会提示语法错误,只不过和上面的原因不一样。提示为:Uncaught SyntaxError: Unexpected token (

在一个表达式后面加上括号(),该表达式会立即执行,但是在一个语句后面加上括号(),是完全不一样的意思,只是分组操作符。

function foo(){
   alert('测试是否弹窗')
}() 
// SyntaxError: Unexpected token ) 
// 报错因为分组操作符需要包含表达式
 
function foo(){ 
    alert('测试是否弹窗')
}(1) 
// (1) => 等价于 1
// 相当于foo方法后面个跟了一个无关系的表达式子:(1)
复制代码

所以上面代码要是想要得到想要的弹窗提示,就必须要实现赋值,如

a = function(){
    alert('测试是否弹窗')
}()
// 弹窗提示成功
复制代码

"a=" 这个片段告诉了编译器这个是一个函数表达式,而不是函数的声明。因为函数表达式后面可以跟圆括号。

因此下面两段代码是等价的

var aa = function(x){  
    alert(x)  
}(5) //弹窗显示:5 复制代码

(function(x){
    alert(x)
})(5) //弹窗显示:5    
复制代码

从上面对于函数和匿名函数的了解,我们引申出来了一个概念,即自执行函数。那为什么a =function(){}() 这种表示方法可以让编译器认为这个是一个函数表达式而不是一个函数的声明?

3.自执行匿名函数

自执行函数,即定义和调用合为一体。我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。

下面我们来看下一些比较有趣的自执行函数表达方式:

// 下面2个括弧()都会立即执行  
(function () { /* code */ } ()) // 推荐使用这个  
(function () { /* code */ })() // 但是这个也是可以用的  
  
// 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的  
// 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了  
var i = function () { return 10; } ();  
true && function () { /* code */ } ();  
0, function () { /* code */ } ();  
  
// 如果你不在意返回值,或者不怕难以阅读
// 你甚至可以在function前面加一元操作符号  
!function () { /* code */ } ();  
~function () { /* code */ } ();  
-function () { /* code */ } ();  
+function () { /* code */ } ();  
  
// 还有一个情况,使用new关键字,也可以用,但我不确定它的效率  
// http://twitter.com/kuvos/status/18209252090847232  
new function () { /* code */ }  
new function () { /* code */ } () // 如果需要传递参数,只需要加上括弧()  
复制代码

4.总结

看到这里相信大家对函数有了全新的认识,希望能够帮助到大家。

文中若有写的不对或需要改进的或者有不同的简介欢迎回复一起探讨。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107114.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat查看日志[通俗易懂]

    tomcat查看日志[通俗易懂]随笔-168文章-1评论-8linux下实时查看tomcat运行日志 1、先切换到:cdhome/tomcat/logs 2、tail-fcatalina.out 3、这样运行时就可以实时查看运行日志了 4.Ctrl+c是退出tail命令 eg: [root@TEST-Alogs]#ls catalina.20…

    2022年6月20日
    35
  • CMS和G1收集器

    CMS和G1收集器转自:https://yuanrengu.com/2020/4c889127.html在开始介绍CMS和G1前,我们可以剧透几点:根据不同分代的特点,收集器可能不同。有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器。一般来说,新生代收集器的收集频率较高,应选用性能高效的收集器;而老年代收集器收集次数相对较少,对空间较为敏感,应当避免选择基于复制算法的收集器。 在垃圾收集执行的时刻,应用程序需要暂停运行。 可以串行收集,也可以并行收集。 如果能做到并发

    2022年5月6日
    31
  • Java学习书籍推荐[通俗易懂]

    Java学习书籍推荐[通俗易懂]一、入门  《Java2从入门到精通》-推荐  《ThinkinginJava》-强烈推荐*  O’reilly的Java编程基础系列-参考*  二、进阶  《JavaCookBook》-非常推荐*(包含了Java编程的Tips,适合当做手册来查阅)  《O’reilly-JavaIO》-推荐*(包含JavaIO编程的各个方面)

    2022年6月19日
    31
  • 用js来实现那些数据结构15(图01)[通俗易懂]

    其实在上一篇介绍树结构的时候,已经有了一些算法的相关内容介入。而在图这种数据结构下,会有更多有关图的算法,比如广度优先搜索,深度优先搜索最短路径算法等等。这是我们要介绍的最后一个数据结构。同时也是本系

    2022年3月25日
    35
  • git下载安装教程

    git下载安装教程git下载安装教程前言:因为最近突然对使用github搭建一个自己的网站并绑定域名特别着迷,但是前提条件是必须得安装git,于是便把安装过程记录下来,便利自己,帮助他人。1.访问git官网下载最新版本git官方网页:https://git-scm.com/download/win在git官网中,有不同操作系统下的git,选择符合自己电脑版本的进行下载就可以了这里我选择的windows,然后根据自己电脑是32位还是64位,在下面两个选项中选择选择好了静待其下好就好了或许会有下载缓慢或无法下

    2022年6月11日
    32
  • webpack版本选择_webpack官网

    webpack版本选择_webpack官网1.先确认node和npm有没有安装node-vnpm-v2.创建一个打包文件夹mkdirtest3.全局安装webpack和webpack-cli使用npm安装会卡在一个地方,因此这里我使用cnpm,没有安装的话,可以百度看看怎么安装cnpminstallwebpack@3.39.2i-gcnpminstallwebpack-cli@3.3.7-gcnpminstallwebpack-dev-server@3.8.0-g4.在test文件夹下面安装对应版

    2022年8月10日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号