js中匿名函数和回调函数
匿名函数:
通过这种方式定义的函数:(没有名字的函数)
作用:当它不被赋值给变量单独使用的时候
1.将匿名函数作为参数传递给其他函数
2.定义某个匿名函数来执行某些一次性任务
var f = function (a) {
return a;
};
回调函数:
function invokeAdd(a, b) {
return a() + b();
}
function one() {
return 1;
}
function two() {
return 2;
}
invokeAdd(one, two);
//3
也可以直接用匿名函数来代替:
invokeAdd(function () { return 1; }, function () { return 2; });
可读性更高的写法:
invokeAdd(
function () { return 1; },
function () { return 2; }
);
还可以:
invokeAdd(
function () {
return 1;
},
function () {
return 2;
});
当将函数A传递给函数B,并由B来执行A时,A就成了一个回调函数(callback function),A如果是一个无名函数,就称为匿名回调函数
回调函数的优势:
1.可以让我们不做命名的情况下传递函数(节省变量名的使用)
2.可以将函数调用操作委托给另一个函数(节省代码编写工作)
3.有助于提升性能
回调函数示例:
需要将一个函数的返回值传递给另一个函数
function multiplyByTwo(a, b, c) {
var i,
ar = [];
for (var i = 0; i < 3; i++) {
ar[i] = arguments[i] * 2;
}
return ar;
}
调用:
multiplyByTwo(1,2,3);
结果:
[2, 4, 6]
function addOne(a) {
return a + 1;
}
调用:
addOne(100);
--101
实现三个元素在两个函数之间的传递:
1.定义另一个数组,用来存储来自第一步的结果
var myarr = [];
myarr = multiplyByTwo(10, 20, 30);
2.循环遍历每一个元素,分别传递给addOne()
for (var i = 0; i < 3; i++) {
myarr[i] = addOne(myarr[i]);
}
调用:
myarr;
[21, 41, 61]
以上代码的缺点使用了两个循环,需要合二为一:
function multiplyByTwo(a, b, c, callback) {
var i, ar = [];
for (var i = 0; i < 3; i++) {
ar[i] = callback(arguments[i] * 2);
}
return ar;
}
调用:
myarr = multiplyByTwo(1, 2, 3, addOne);
用匿名函数来代替addOne(),可以节省一个额外的全局变量
myarr = multiplyByTwo(1, 2, 3, function (a) { return a + 1;});
即时函数:(在定义后立即调用)
(
function () {
alert('boo');
}
)();
只需要将匿名函数的定义放进一对括号中,然后外面紧跟一对括号即可。第二对括号起到“立即调用”的作用,也是我们向匿名函数传递参数的地方
(
function (name) {
alert('Hello' + name + '!');
}
)('dude');
使用匿名函数的好处是不会产生任何全局变量,缺点是这样的函数是无法重复执行的(除非放在某个循环或其他函数中),使的即时函数非常适合执行一些一次性的或初始化的任务
内部私有函数:
在一个函数中定义另一个函数
function outer(param) {
function inner(theinput) {
return theinput * 2;
}
return 'The result is ' + inner(param);
}
改用函数标识法:
var outer = function (param) {
var inner = function (theinput) {
return theinput * 2;
};
return 'The result is ' + inner(param);
};
结果:
outer(2); --The result is 4
outer(8); --The result is 16
inner(2); --inner is not defined
使用私有函数的好处:
1.有助于我们确保全局名字空间的纯净性
2.确保私有性——只选择一些必要的函数暴露给“外部世界”,而保留属于自己的函数,不为该应用程序的其他部分所用
返回函数的函数:
function a() {
alert('A');
return function () {
alert('B');
};
}
var newFync = a();
newFync();
让返回的函数立即执行:
a()();
js中匿名函数和回调函数的更多相关文章
- JS之Callback function(回调函数)
JS中的回调函数: 1.概念: 函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b,那么这个过程就叫回调,即把函数作为参数传入到另一个函数中,这个函数就是所谓的回调函数. 2.举例: ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...
- C++中的Thunk技术 / 非静态类成员函数作为回调函数 的实现方法
原文:https://blog.twofei.com/616/ 用我的理解通俗地解释一下什么是C++中的Thunk技术吧! Thunk技术就是申请一段可执行的内存, 并通过手动构造CPU指令的形式来生 ...
- Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数
Unity C# 调用 C++ DLL 并在 DLL 中调用 C# 的回调函数~~~ 呵呵... 看着有点晕.. 再解释一下就是 在Unity中 使用 C# 调用 C++ 写的 DLL, 但是在 ...
- JS中的日期内置函数
用JS中的日期内置函数实现在页面显示:“今天是:2013年9月26日14:32:45”. var date=new Date(Date.parse('9/26/2013 14:32:45')); ...
- 基于Lwip协议栈中独立模式下回调函数的使用
一.使用Lwip协议独立模式开发 最近在STM32F4上边移植了Lwip,Lwip是一个小型开源的TCP/IP协议栈,有无操作系统的支持都可以运行.我当前只测试了TCP Server功能,然后对TCP ...
- js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...
- python中进程池和回调函数
一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...
- Go基础系列:函数(2)——回调函数和闭包
回调函数和闭包 当函数具备以下两种特性的时候,就可以称之为高阶函数(high order functions): 函数可以作为另一个函数的参数(典型用法是回调函数) 函数可以返回另一个函数,即让另一个 ...
- php自定义函数之回调函数
回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构.大理石平台价格 回调函数,就是在处理一个功能的时候,我让让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数 ...
随机推荐
- 【VMware vSphere】vSphere Data Protection简介
[前言] 还记得一月份左右的时候,万达这边的服务器突然宕机,导致所有的项目不得不停止不说,还损失掉了很多宝贵的数据.为了防止这种情况再次发生,所以近期研究了vSphere Data Protectio ...
- DAC杂谈二 ——ADC和DAC常用技术术语
采集时间 采集时间是从释放保持状态(由采样-保持输入电路执行)到采样电容电压稳定至新输入值的1 LSB范围之内所需要的时间.采集时间(Tacq)的公式如下: 混叠 根据采样定理,超过奈奎斯特频率的输入 ...
- Go语言程序开发初涉
由于工作原因,现在开始学习Go语言.这也是本人第一篇关于Go的博客.本文将通过一些基本概念的说明和实际案例,使得大家能快速对Go程序的开发有个了解. 一. Go的安装 : 在 https:// ...
- Delphi 实现自动更新
Delphi 通用程序自动更新升级:http://www.delphitop.com/html/wangluo/2968.html https://www.cnblogs.com/hnxxcxg/p/ ...
- http://nancyfx.org + ASPNETCORE
商务产品servicestack: https://servicestack.net/ http://nancyfx.org + ASPNETCORE http://nancyfx.org ...
- Statically Linking freeglut
It’s possible statically link freeglut into your applications, instead of dynamically linking agains ...
- FreeSWITCH voicemail
功能描述:分机不存在时,进行语音留言. 步骤: 1.编译mod_voicemail 模块.默认是已经有编译 2.加载mod_voicemail模块: fs_cli --> reload mo ...
- Linux命令之control快捷键组合
***********************Linux系统中的一些control快捷键组合汇总如下************************ ctrl+a:光标移到行首. ctrl+b:光标左 ...
- 解决layui选中项下一页清空问题
项目中遇到给用户在所有产品中匹配一部分产品.用layui 第一页选好之后到第二页再选,等回到第一页时之前选择的都没了,解决这个问题的办法如下: //勾选的产品id集合 var chooseAdids ...
- Sql 08数据库还原数据库时一直提示数据库被占用
直接试试这个sql语句吧 ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE ALTER database [datebase] ...