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自定义函数之回调函数
回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构.大理石平台价格 回调函数,就是在处理一个功能的时候,我让让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数 ...
随机推荐
- AMBA总线协议AHB、APB、AXI对比分析【转】
转自:https://blog.csdn.net/ivy_reny/article/details/56274412 一.AMBA概述 AMBA (Advanced Microcontrolle ...
- matlab处理手写识别问题
初学神经网络算法--梯度下降.反向传播.优化(交叉熵代价函数.L2规范化) 柔性最大值(softmax)还未领会其要义,之后再说 有点懒,暂时不想把算法重新总结,先贴一个之前做过的反向传播的总结ppt ...
- RS485 通信接收时丢失0x11等数据
RS485通信接收方,丢弃掉了值为 0x11 的数据. 怀疑 0x11 被转义,没有按照原始数据接收, 查看ASCII码对应表 0x11 代表 “本文结束”, 因此丢弃是有可能的. 要想接收原始数据而 ...
- Golang -- range小坑铭记
废话少叙,先上一段代码,猜猜预期的效果. package main import ( "fmt" ) type student struct { Name string Age i ...
- ASP.NET MVC5入门2之Ajax实现数据查询
开发环境:VS2013 数据库:SQL Server2008R2 架构:ASP.NET MVC5 开发语言:C# 代码下载链接:http://download.csdn.net/detail/u010 ...
- python学习第42、43天 HTML\CSS
前端是什么? 帮助不了解后端程序的客户轻松使用程序的工具,可以提升工作效率,提供各种各样的体验. 通用的前端大致会使用三种语言,用在三个不同的方面对前端进行架构和优化,这里也只介绍这三种 web前端常 ...
- Mysql --初识mysql语句
本节课先对mysql的基本语法初体验. 操作文件夹(库) 增 create database db1 charset utf8;#db1 是数据库的名字 也就是文件夹 查 # 查看当前创建的数据库 s ...
- 【原创】大叔经验分享(36)CM部署kafka
1 下载kafka parcel http://archive.cloudera.com/kafka/parcels/latest/KAFKA-3.1.1-1.3.1.1.p0.2-el7.parce ...
- [转] 为什么说 Java 程序员必须掌握 Spring Boot ?
Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,那么, Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot ...
- 23)django-缓存
一:目录 1)简介 2)django缓存方式 3)django应用方式 二:简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显, 最简单解决方 ...