匿名函数以及为什么要在匿名函数前面加“!”或者“;”

本文解释了JavaScript中匿名函数立即执行的语法形式及其原因,包括分号的作用及避免压缩时可能产生的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天经常遇见这样的写法:

;(function () {}) () 

开始的时候以为是书写错误,多加了个分号,后来遇到的多了,才意识到可能是我错了...

然后就上网查了一番,现在终于大白于天下,整理记录一下吧~

首先要知道什么是匿名函数,我们知道函数的声明方式有以下两种:

function fn() {} // 声明式

var fn = function(){} // 赋值表达式

然后调用这个函数的时候就在函数名后面加一对小括号:

fn ()

但是,当我们直接在声明的函数后面直接加()时,浏览器会报错:

function(){}() // 浏览器无法解析

但是如果将函数体用()包起来,是不会报错的,像下面这样:

(function(){})() // 这个也就是匿名函数

原因是,使用括号包裹函数体,浏览器会以函数表达式的方式调用定义函数,也就是任何能将函数变成一个函数表达式的方法,都可以被浏览器正确接续,有这个功能的符号比如:! + - || 等一元操作符

!function(){}() // 这样是可以滴

那前面加;的是神马意思呢?

“;”一般在js中是为了分隔代码,js可以使用换行分隔代码,但是当js文件压缩后换行符一般会被删掉,就会把代码连在一起,可能会出错,所以前面加上;就保险了。。。

好吧,说了这么多,其实“;”就是起到AQT的作用 。。。






### C++ Lambda 表达式概述 Lambda 表达式是 C++11 引入的一种匿名函数机制,能够简化代码编写过程。其基本结构由捕获列表、参数列表和函数体三部分组成[^3]。 #### 捕获列表 用于指定哪些局部变量可以在 lambda 函数体内访问。常见的形式有: - `[]`:不捕获任何外部变量。 - `[=]`:按值捕获所有外部变量。 - `[&]`:按引用捕获所有外部变量。 - `[this]`:捕获当前对象的 this 指针。 - `[a, &b]`:显式地按值捕获 a 和按引用捕获 b。 #### 参数列表 类似于常规函数的形参声明方式,可以为空也可以包含多个参数。 #### 函数体 执行的具体逻辑语句集合。 下面是一个简单的例子来展示如何创建并调用一个 lambda 表达式: ```cpp #include <iostream> using namespace std; int main() { auto add = [](int x, int y) -> int { return x + y; }; // 定义了一个法操作的lambda表达式 cout << "Sum of 5 and 7 is: " << add(5, 7) << endl; return 0; } ``` 当涉及到更复杂的场景,比如需要处理容器内的数据,则可以通过标准库算法配合 lambda 来实现高效的操作。例如使用 `std::for_each` 遍历向量中的元素并输出它们[^2]。 ```cpp #include <iostream> #include <vector> #include <algorithm> int main(){ vector<int> nums{1, 2, 3, 4, 5}; // 使用lambda表达式打印vector中的每一个整数 for_each(nums.begin(), nums.end(), [](const int& num){ cout << num << ' '; }); cout << "\n"; return 0; } ``` 此外,在某些情况下可能还需要让 lambda 访问所在作用域之外定义的一些特定变量。这就可以利用前面提到过的捕获功能了。这里给出另一个实例说明这一点。 ```cpp #include <iostream> using namespace std; void print_with_offset(int offset) { // 创建一个带有offset偏移量的lambda表达式,并通过引用的方式获取外部变量i auto printer = [&offset](int value){ cout << (value + offset) << '\n'; }; for(int i = 0 ; i != 5 ; ++i ) printer(i); } int main(){ print_with_offset(-1); return 0; } ``` 上述代码展示了不同类型的 lambda 应用案例,包括但不限于简单运算、迭代器遍历以及带状态变化的情况下的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值