深入剖析立即执行函数的执行方式

AtmelStudio 7 ASF库学习笔记一:新建工程、配置时钟、下载程序和查看官方例程 由于需要学习一下atmel的atsaml 系列,使用AtmelStudio 7开发,之前主要用STM32,现在看到Atmel的库函数,其实是有些类相似的。 ASF3的库对应ST的标准库。ASF4对应ST的HAL库,Ateml Start对应STM32CubeMX。但在这里还是用ASF3来开发,因为Ateml Start还不支持我的这个芯片,而且和STM32的HAL库类似,ASF4为了好移植都是底... 阅读详情

表达式

讲立即函数之前,首先来理解什么是表达式
表达式: 指的是可以被求值的代码,也就是说只要代码能求得(返回)一个值的,它就是表达式。
例子:
以下都是表达式,这里只举一部分例子。

var a = 10 //赋值表达式,它的结果就是 10

a; //变量表达式,它的结果就是10

123; //也是表达式 它的结果就是它本身

'abc'; //字符串表达式 结果是自身

var arr = [1,2,3]; //数组创建表达式,结果是数组的引用地址

a[1]; //数据访问表达式,它的结果就是2

2 * 2;  //运算表达式

var obj = {} //对象创建表达式 结果是对象的引用地址

以上123、‘abc’ a是原始表达式,是表达式中最小的单位,不能包含其他表达式,而其他的表达式都是复杂表达式,也就是说由其他表达式组成的表达式,比如var arr = [1,2,3]; 是由赋值表达式和数组表达式组成的复杂表达式,在比如a[1]是由变量表达式和原始表达式组成的

总结: 表达式指的是可用于计算得出结果的式子,即可能产生一个值的式子。

语句: 是一条完整的指令,就像我们汉字里的一句话一样,使用句号表示句子的结尾,而在程序中是以分号结尾,表示一条指令的结尾。

表达式和语句的区别
表达式是可以被求值的代码,而语句不全是,表达式可以是语句,而语句不全是表达式,比如if、for、break等都是不能被求值的,所以这些代码都不是表达式。

立即执行函数

也叫初始化函数,函数只执行一次就被销毁,适合做初始化的工作。

语法: 函数名可选

(fucntion 函数名(参数,参数)(){
	return;
}())
或者
(fucntion (参数,参数)(){
	return;
})()

为什么这种形式的函数可以被执行呢? 我们执行函数不是需要函数名吗? 别急看看下面的内容你就知道为什么不需要函数名就可以被执行。

函数声明和函数表达式的区别
函数的创建(定义)分为两种,一种是函数声明一种是函数表达式。根据上面的分析,只要能被求值的就叫做表达式,因此函数表达式一定是能被求值的并且它的值就是函数引用,而函数声明是不能被求值,函数声明仅仅是创建函数,函数声明没有结果。

函数声明:
它仅仅是创建,不能被求值,它并没有返回一个值。

function a(){
}

函数表达式:
函数作为赋值的一部分,它必须求得一个函数的引用地址,所以它必然会被js引擎解析为函数表达式,以下函数表达式的值就是该函数的引用地址并把引用地址赋给变量a

var a = function(){}; 

函数表达式的特点:
函数表达式还要补充一点,函数表达式的函数名只在内部有效,在函数外部函数名会被忽略掉,因此立即执行函数为什么会执行一次就销毁,因为函数名在外部是会被忽略掉的。

例子:
函数执行完一次就再也找不到,立即被销毁,函数名fn在函数外部会被忽略掉,因此你在函数外部使用函数名fn会报错,但是在内部是可以使用fn。

(function fn(){
    var a = 123;
    var b = 234;
    console.log(fn); 可以被执行,值是函数
    console.log(a + b);
}());

fn() 报错找不到fn这个标识符

函数的执行:
只有函数表达式才能被执行,函数声明不能被执行,因为我们执行函数就是引用地址加对括号()就能执行,因为执行函数需要引用地址才能找到内存中的函数并执行,函数声明只能是创建函数不能被求值,而函数表达式可以被求值,表达式的值就是函数的引用地址。

分组操作符()
括号()运算符也叫分组操作符,它的作用是将里面表达式的求值结果返回,因此里面必须是一个表达式不能是声明语句,因此里面的函数会被解析成函数表达式而不是函数声明,这就是为什么立即执行函数都是函数表达式。

ps: if for var等语句不能写在()中,因为这些语句不能被解析成表达式

例子1
以下代码中,根据上面说的函数执行需要引用地址才能执行,fn是变量表达式里面保存的就是函数引用地址,因此后面加对括号就能执行,这里的括号就表示函数执行符。

function fn(){
	console.log('success');
}
fn(); 

例子2
以下代码会报错,函数声明不能被求值,根据上面所诉函数执行需要函数地址,没有函数引用地址就无法执行函数,所以()被js解析成了分组操作符就是我们数学当中(),并没有被解析成函数执行的符号。

()被解析成了分组操作符不是函数执行符,分组操作符里面必须是表达式否则报错,
但是下面括号什么东西都没有所以报错了
function fn(){
	console.log('success');
}();

例子3
这里也是和上面同理()被解析成分组操作符,但是这种情况下不会报错,但函数也不会得到执行,因为括号里面是逗号表达式所以才没有报错,如果括号里什么都没写就会报错

function fn(a,b,c){
	console.log('success');
}(1,2,3)

例子4
函数表达式是可以被求值,它的值就是函数的引用,因此可以通过引用地址找到函数,执行函数里面的代码,因此以下代码都可以得到执行。

var a = fucntion(){
	console.log(1111)
}();

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

+ function (){
	console.log(2222);
}()

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

上面为什么运算符也可以执行函数? 因为正负是运算符,因此后面的函数必须解析成表达式求得一个结果,才能执行正负运算,声明语句是不能执行正负运算的,()里面必须是表达式,因此()里的函数会被解析成函数表达式。

Open3D DBSCAN聚类 DBSCAN算法做为一种有名的密度聚类算法,它是通过邻域参数(Distance,MinPts)来刻画样本分布的紧密程度。而在真正开始之前,首先要理解下面这几个概念:更为具体的内容也可参考这篇文章点云DBSCAN聚类算法。... 阅读详情

相关推荐

支持找回微信删除好友!一款人人可用的全能微信数据分析工具

找回删除好友、查看删除记录、恢复聊天信息....

1727

立即执行函数

立即执行函数(IIFE),也叫做自执行函数,就是不需要调用就立马执行的函数。 在解释立即函数的时候,我们先了解一下三个函数相关的知识: 函数声明: function fun() { } 函数表达式: var fun = function () { } 匿名函数: function() { } 立即函数有两种常见格式: (function() { console.log(999) }()) (fun...

weixin_34122810的博客 234

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 945

【前端 教程】详解 立即执行函数

【前端 教程】立即执行函数 详解 1、定义 立即执行函数:声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;即立即执行函数是定义函数以后立即执行该函数。 2、立即函数的写法 在理解立即函数写法之前 需要先回顾一下JS的函数定义的几种方式 这样会便于更好理解立即执行函数、 ps:JS中函数定义方法的自行脑补 我们定义好函数之后,立即调用该函数,这时不能在函数的定义后面直接加圆括号,这会产生语法错误。 //这是错误的 function fn(){}() 这是因为:function 这个关键字,既可以

菜鸟的后花园 1万+

【Ragflow】9.问答为什么比搜索响应慢?从源码角度深入分析

前几天看到有群友提到一个现象:Ragflow的搜索界面的问答速度很快,但聊天界面的问答速度很慢,究竟是什么原因?在深入挖掘源码之后,逐渐发现了问题的答案。

兴趣使然的创作者 2904

图解说明JLink驱动与目标板电源匹配的关键细节

深入讲解JLink驱动安装及使用过程中,如何正确匹配目标板电源,避免常见通信故障。通过图解方式清晰展示关键连接细节,确保调试稳定可靠,是嵌入式开发中不可或缺的实战经验分享。

weixin_42173218的博客 431

JavaScript 之 立即执行函数

1、定义 ​ 声明一个函数,并立即调用这个函数,此时这个函数就是立即执行函数,简单来说就是定义函数之后立即执行该函数。立即执行函数一般也写成匿名函数的形式,匿名函数写法为 function(){},就是使用function关键字声明一个函数,但是未命名的函数。关于匿名函数有一点要注意的是:匿名函数不能单独使用,否则会报错,至少需要用 () 包裹起来。 2、作用 ​ ① 不需要为函数命名,避免污染全局变量。 ​ ② 创建一个独立作用域,这个作用域里面的变量,外部访问不到,避免变量污染。 ​ ③ 闭包和

weixin_45092437的博客 4474

Arcgis加载在线地图(内涵各种在线地图)

这三个在线地图是最常用的在线地图,其他几个类型的在线地图请自行查看。,加载出在线图层说明连接成功,点击。1、首先打开Arcgis,找到。

爱吃雪糕的小布丁的博客 1万+

立即执行函数,闭包函数

声明一个函数,并马上调用这个匿名函数就叫做立即执行函数。

m0_66706006的博客 560

控制算法研发工程师(博士)职位深度解析与面试指南

摘要:广东万和新电气股份有限公司招聘控制算法研发工程师(博士),工作地点佛山顺德。职位要求2026届博士学历,电子信息工程或控制科学与工程专业。主要职责包括:1)燃气热水、热泵等系统的电控软件设计与优化;2)开发PID、模糊控制、ADRC、MPC等智能算法,应用于恒温控制、变频调节等场景。重点考察算法研发能力、系统稳定性优化及嵌入式实现经验。该职位提供三年资深工程师培养计划,需具备扎实的控制理论基础和工程实践能力,能够处理非线性系统、多工况自适应等复杂控制问题。

郑伟强dev的专栏 139

[Python] -项目实战10- 用 Python 自动化批量重命名文件

本文介绍了使用Python实现文件批量重命名的技术方法。主要内容包括:1)使用os和pathlib模块进行基础文件操作;2)提供多种实用脚本示例,如添加序号、替换字符、添加时间戳等;3)进阶功能包括用户输入和错误处理;4)GUI工具实现方案;5)常见问题与优化建议。文章详细讲解了从简单到复杂的批量重命名实现方法,帮助读者快速掌握这一提高工作效率的技能。建议开发者注意路径处理、错误管理等细节,确保脚本稳健运行。

每日出拳老爷子的博客 815

JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)

本文全面剖析JavaScript中立即执行函数(IIFE)的核心概念与应用场景。详细讲解IIFE的两种语法形式、独立作用域创建原理及其在模块化开发中的关键作用,通过闭包实现私有变量保护的经典模式。深入分析IIFE在避免全局污染、模拟块级作用域和代码初始化方面的独特优势,并指出变量提升等注意事项。掌握IIFE技术能够帮助开发者编写更加安全、模块化的JavaScript代码,有效管理作用域和变量可见性

m0_73941339的博客 1289

ESP32设备驱动-AS5600磁性旋转位置传感器

AS5600 是一款可编程的 12 位高分辨率非接触式磁性旋转位置传感器。 AS5600可以作为磁性电位器或磁性编码器使用,具有出色的可靠性和耐用性。 与传统电位器/编码器相比,AS5600具有显着优势:高精度、非接触式、旋转角度无限制。 所有这些优点使其适用于非接触式角度测量应用,例如机器人手臂、云台、电机闭环控制、机床轴定位。

视觉与物联智能 2553

JavaScript中匿名函数,函数直接量和闭包(转)

<br />原文出处: http://www.dnew.cn/post/196.htm 先看下下面几种写法 1.function f(x){return x*x;};f(x); 2.(function(x){return x*x;})(x); 3.(function(x){return x*x;}(x)); 第一种我们应该都很熟悉了,这是我们经常使用的写法。第二第三种都是匿名函数的写法。 -------------------------------------------------

liyifei21的专栏 619

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

08 - Go 函数(中):匿名函数、闭包与函数式编程

本文深入讲解Go函数的核心进阶特性:匿名函数(立即执行/变量赋值)、函数作为一等公民(参数传递/返回值)、闭包机制(状态保存/面试重点)和defer延迟执行(资源管理/执行顺序)。重点揭示了闭包的本质是"函数+外部变量引用",以及函数式编程在策略模式、回调处理中的应用场景。这些概念是区分Go初学者与进阶开发者的关键,尤其闭包和defer在实际工程中广泛用于资源封装、中间件设计等场景,属于必须掌握的编程范式。文章还预告了下篇将剖析defer陷阱、值传递等深

XMYX-0 461

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Javascript之函数

函数的定义方式一般分为四种,分别为函数声明、函数表达式、箭头函数、立即执行函数。

2301_80982154的博客 856

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Javascript《一》

关键词:《javascript语言精粹》 【 编译原理 && 作用域 】 【 立即执行 && 块作用域 】 【 函数优先提升 && 作用域闭包 】 【 let && const 】 【 模块 】 ...

chengyo3165的博客 133

深入理解call,apply,bind相同点及区别

摘要: 本文总结了JavaScript中call、apply、bind的异同及底层实现原理。相同点:三者均用于修改函数this指向。不同点:call按顺序传参,apply通过数组传参,bind返回新函数并支持柯里化;call和apply立即执行,bind延迟执行。底层原理: call:通过临时绑定函数到目标对象并调用,处理null时指向全局对象,支持参数传递。 apply:类似call,但参数以数组形式传入。 bind:返回新函数,合并预传参数与后续参数,支持构造函数场景(this失效但参数保留),并维护原

秋子的博客 1099

Vue2自定义指令与侦听器

本文深入解析Vue2的自定义指令体系与侦听器机制。主要内容包括: 自定义指令的完整语法结构、局部/全局注册方式,以及bind/inserted/update/componentUpdated/unbind五个钩子函数的执行时机; binding参数的结构解析,包含name/value/arg/modifiers等关键字段; 通过v-focus自动聚焦、v-permission权限控制、v-lazy图片懒加载三个实战案例展示指令开发; watch侦听器的三种写法(函数/字符串/对象),以及deep深度监听和i

黄裳博客 364

从惰性求值到高效迭代:深入解析Python中map与lambda的协同工作机制

本文深入解析Python中map与lambda的协同工作机制,探讨惰性求值在数据处理中的优势与应用。通过对比测试和实战案例,展示map+lambda在内存效率、计算灵活性方面的独特价值,并提供五种触发计算的方法与常见避坑指南,帮助开发者高效处理数据转换任务。

weixin_30265103的博客 554

剖析原理:JS基础篇——立即执行函数

1.什么是立即执行函数(IIFE) 在了解立即执行函数之前先明确一下函数声明、函数表达式及匿名函数的形式,如下图两种常见方式: //1. 匿名函数后面跟一个小括号, 整个包裹在一个括号运算符中 (function() { //... }()) //2. 匿名函数包裹在一个括号运算符中, 后面跟一个小括号 (function() { //... ...

weixin_42024074的博客 267

什么是自执行函数?

这里是修真院前端小课堂,每篇分享文从 【 什么是自执行函数?】 大家好,我是IT修真院北京总院第24期的学员,一枚正直纯洁善良的web程序员 今天给大家分享一下,修真院官网js任务2,深度思考中的知识点——什么是自执行函数? 1.背景介绍 在详细讲解自执行函数之前,我们先来说一下这个函数在叫法上的争议。实际上不同的人对自执行函数的理解不太一样, 第一种理解是,自执行即自动执行,也就是大家平时所谓的...

learning_web的博客 1921

什么是自执行函数

这里是修真院前端小课堂,本篇分析的主题是 【什么是自执行函数】 1.背景介绍 在详细讲解自执行函数之前,我们先来说一下这个函数在叫法上的争议。实际上不同的人对自执行函数的理解不太一样,第一种理解是,自执行即自动执行,也就是大家平时所谓的立即执行函数。 还有一种理解,即自执行函数是在函数内部执行函数本身,即我们平时常说的递归函数。不管是哪种理解,我们都没必要去纠结叫法上的准确与否,...

IT修真院:初学者转行到互联网的聚集地 264

深入剖析apply、call、bind的区别:JavaScript中的函数调用方式

applycall和bind都是JavaScript中用于控制函数this指向的重要方法。call和apply主要用于在特定对象上下文中立即执行函数,它们的区别在于参数传递方式,call逐个传递参数,apply以数组形式传递参数。bind则是返回一个新的函数,用于延迟执行,并且可以预先绑定参数,提供了更灵活的参数传递方式。在性能方面,call和apply差异较小,bind由于创建新函数可能会带来一定的性能开销。

你若盛开,清风自来 2162

web面试准备

由于最近在准备实习面试,所以我总结了一些面试问题,方便自己查阅。 前端开发 Web Front-end development 1、开发什么? 结构布局,样式呈现,页面动态交互( JavaScript脚本),数据交互处理,数据格式化渲染 html-css 2、 title (30-40个字 网站名称+主要关键字、关键字描述),keywords (关键字、100个字符、网站名称+分类信息+网...

qq_44434408的博客 240

JavaScript中的立即执行函数表达式

前言 在使用JavaScript的时候经常会看见类似如下的函数调用方式: (function(){ console.log("test"); })(); 或者 (function(){ console.log("test"); }()); 一些流行的库也是这样,比如jQuery (function( window, undefined ) {

jackyechina的专栏 2191
上一篇: js 作用域
下一篇: 执行上下文与词法环境
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值