前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >用匿名函数定义函数_c语言最先执行的函数是

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

作者头像
全栈程序员站长
发布于 2022-08-04 01:26:31
发布于 2022-08-04 01:26:31
1K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

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

1.1函数的声明

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function add(x,y){  
   alert(x+y) 
}  
add(1,2) //弹窗显示:3 复制代码

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add(1,2); //弹窗显示:3  
function add(x,y){  
    alert(x+y) 
}  

1.2函数表达式

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var add = function(x,y){  
    alert(x+y) 
}
add(1,2) //弹窗显示:3

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add(1,2) //无弹窗,报错: add is not a function  
var add = function(x,y){  
    alert(x+y)  
} 

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

2.匿名函数的调用方式

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alert((function(x,y){
    
    return x+y;})(2,3)) //弹窗提示5  
alert((new Function("x","y","return x+y"))(2,3)) //弹窗显示5  

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function(){  
    //这里是块级作用域  
})();  

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function(){  
      
}();  

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = function(){
    alert('测试是否弹窗')
}()
// 弹窗提示成功

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var aa = function(x){  
    alert(x)  
}(5) //弹窗显示:5 复制代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function(x){
    alert(x)
})(5) //弹窗显示:5    

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

3.自执行匿名函数

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 下面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.cn/107114.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js的匿名函数_匿名函数
关于函数声明,它最重要的一个特征就是函数声明提升,意思是执行代码之前先读取函数声明。不管函数声明写在前面,还是后面,都会出现函数声明的提升。 如下代码可以正确执行:
全栈程序员站长
2022/11/09
4K0
匿名函数自调用_自己调用自己的函数叫
我们知道一个HTML文件在被加载的时候是从根标签html依次往下的,在遇到link,script等标签引入的外部资源时,下载外部资源,并执行外部资源。在js中,表达式会被立即执行,也就是说,不管是引入的外部js文件还是嵌入在html文件中的js脚本,其中的表达式都会被立即执行。 函数名是一个指向函数的指针。在JavaScript中,定义函数有常见的两种形式:函数声明和函数直接量(或者叫函数表达式)。 函数声明:采用function定义声明函数的标准写法,包括function,函数名,函数体。如
全栈程序员站长
2022/11/09
2.6K0
匿名函数与自执行函数
匿名函数就是指的没有名字的函数,即定义函数对象时不定义函数体名字,但是必须将匿名函数作为表达式赋予一定操作,比如将其作为变量值或者让其自执行,否则这次定义将无意义,解释器也会抛出异常。
WindRunnerMax
2020/08/27
1.4K0
立即执行函数表达式(IIFE)
原文:immediately-invoked-function-expression 译者:nzbin 也许你还没有注意到,我是一个对术语比较坚持的人。因此,在听到很多次比较流行却容易产生误导的 JavaScript 术语“自执行匿名函数”之后,最终我决定把我的想法写成一篇文章。 为了提供关于这一模式如何运作的透彻信息,我已经提出了我们应该如何称呼它的建议,继续向下看。当然,如果你想跳过开头,你可以只看“自执行函数表达式”这一节,但是我建议你看完整篇文章。 请明白这篇文章并非要表达“我是对的,你是错的”
叙帝利
2018/01/17
9370
JavaScript的IIFE(即时执行方法)
前面的话   严格来讲,IIFE并不是闭包,因为它并不满足函数成为闭包的三个条件。但一般地,人们认为IIFE就是闭包,毕竟闭包有多个定义。本文将详细介绍IIFE的实现和用途 实现   函数跟随一对圆括号()表示函数调用 //函数声明语句写法 function test(){}; test(); //函数表达式写法 var test = function(){}; test();   但有时需要在定义函数之后,立即调用该函数。这种函数就叫做立即执行函数,全称为立即调用的函数表达式IIFE(Imdiately
庞小明
2018/03/07
1.5K0
JavaScript 匿名函数几种执行方式[通俗易懂]
其中说到了 self-executing anonymous functions,有几种方式,最常见也比较容易理解的是:
全栈程序员站长
2022/11/09
9800
JavaScript 匿名函数几种执行方式[通俗易懂]
JavaScript 函数的定义
JavaScript函数是指一个特定代码块,可能包含多条语句,可以通过名字来供其他语句调用以执行函数包含的代码语句。
WEBING
2019/02/26
1.1K0
JavaScript 函数的定义
浅谈自执行函数(立即调用的函数表达式)
既然函数名加上括号fun1()就是执行函数。 思考:直接取赋值符号右侧的内容直接加个括号,是否也能执行? 试验如下,直接加上小括弧:
celineWong7
2020/11/05
3.6K0
对JAVASCRIPT匿名函数的理解
网上很多解释,我无法理解,我想知道原理。。。这篇文章应该可以透彻一点 Query片段: (function(){ //这里忽略jQuery所有实现 })();   要说匿名函数,我们首先要由函数本身说起。函数的定义如下: 函数是将唯一的输出值赋予给每一输入的“法则”。   当然,这只是数学上的定义。但是,在计算机编程语言中,函数的定义也八九不离十。因为,我们都知道,计算机中的函数,也类似数学定义中的描述,它是将输入的若干数据,经过代码设定的逻辑操作处理后,返回唯一的输出的一组代码组合块。—
用户1214487
2018/01/24
1.2K0
函数与作用域
1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。 1.function命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面传入函数的参数。函数体放在大括号里面。 function add(s) { console.log(s) } 上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应
小胖
2018/06/27
8480
js的匿名函数 转
js的匿名函数 jQueryJavaScript编程浏览器 对javascript匿名函数的理解(透彻版)网上很多解释,我无法理解,我想知道原理。。。这篇文章应该可以透彻一点  Query片段
tianyawhl
2019/04/04
3.8K0
JavaScript(八)
这一篇,我们介绍一下函数表达式。 之前说过,定义函数的方式有两种: 一种是函数声明,另一种就是函数表达式。
1ess
2021/10/29
2280
JS与ES6高级编程学习笔记(二)——函数与作用域
开发者常戏称"函数是JavaScript中的一等公民",这足以体现了函数的重要性,为了更好的掌握函数我们需要学习函数的构造器Function等相关内容。
张果
2022/05/31
1.4K0
JS与ES6高级编程学习笔记(二)——函数与作用域
javascript模仿块级作用域
模仿块级作用域 var somefunction=function(){ ///这里是块级作用域 } somefunction(); 在这里定义了一个函数,然后立即调用。不会报错。 然而,下面的代码: function(){ //这里是块级作用域 }(); //出错 这段代码会导致语法错误,因为javascript将function关键字当做一个函数声明的开始,而函数声明后不能跟圆括号。 然而函数表达式的后面可以跟圆括号。将函数声明转为函数表达式,像下面给它加上一对圆括号就可以了: (function()
wangxl
2018/03/07
7050
啊,函数呐!!!
一份需要你补充完整的函数导图!我还是一个初学者,这篇文章是我所知道的所有关于函数的知识,如有不完善或者错误,希望能够在评论下方指出,哈哈哈,大神勿喷。
sunseekers
2018/10/31
8410
JavaScript 学习-7.函数定义的几种方式
之前学习变量的时候,学到一个词:”声明提升”,函数声明也会被提升。 “hoisting(声明提升)”:函数声明和变量声明总是会被解释器悄悄地被”提升”到方法体的最顶部。
上海-悠悠
2022/05/17
8890
js什么是匿名函数_js函数返回值
js匿名函数的代码如下: (function(){ // 这里忽略jQuery 所有实现 })();
全栈程序员站长
2022/11/10
7.1K0
Immediately-Invoked Function Expression (IIFE)即调函数表达式
以防你没有注意到,我先声明下:我总是要求术语。所以,在听到许多次 流行的,但是让人误解的 JavaScript术语“self-executing anonymous function自我执行匿名函数(或者self-invoked anonymous function自我调用匿名函数)”之后,最终我决定把我的想法组织成一篇文章。 除了提供一些关于IIFE这个模式的非常详细的信息,我也在‘我们该如何称呼它’上 做了建议。此外,如果你想跳到前面,你可以只查看下面的Immediately-Invoked Function Expressions部分,但是我建议读完整篇文章。 这篇文章不是想表达“我是对的,你是错的”,这类的事情。我是真的对“帮助其他人理解潜在地复杂概念”感兴趣,并且觉得“使用一致和准确的术语是人们可以做的促进理解 最简单的事情”。
lesM10
2019/08/26
7930
js基础知识
最主要区别是函数名称 在函数表达式中可省略函数声明,从而创建匿名函数
星辉
2019/01/15
5490
深入理解立即执行函数
立即执行函数常用于第三方库,它可以用来隔离变量作用域,很多第三方库都会存在大量的变量和函数,在ES5环境下为了避免变量污染,开发者想到的解决办法就是使用立即执行函数。
神奇的程序员
2022/04/10
1.3K0
相关推荐
js的匿名函数_匿名函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文