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自定义函数之回调函数
回调函数,可以配合匿名函数和变量函数实现更加优美.复杂的一种函数结构.大理石平台价格 回调函数,就是在处理一个功能的时候,我让让这个功能自定义能力再强一些,我准许调用这个函数的时候,还可以传入一个函数 ...
随机推荐
- 20165231 2017-2018-2《Java程序设计》课程总结
每周作业链接汇总 预备作业一:我期待的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:linux安装及学习 第一周作业:初识JAVA,注册码云并配置Git 第二周作业:JAVA基本语法,标 ...
- [CentOS]Failed to start OpenSSH server daemon
问题描述: 以前一直能够通过Xshell来连接服务器,但是突然连接不上了. 解决思路: 首先通过命令查看SSH服务的状态: systemctl status sshd 可以看到,有错误,但是没有显示详 ...
- Linker Scripts3--简单的链接脚本命令2-Assigning Values to Symbols
1.前言 本章继续讲述简单脚本命令的后半部分 2.Assigning Values to Symbols 你可以给一个符号(symbol)赋值,它会把这些定义的符号放入全局符号表(symbols ta ...
- linux syscall 详解【转】
转自:https://blog.csdn.net/feixin620/article/details/78416560 引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及ap ...
- http://nancyfx.org + ASPNETCORE
商务产品servicestack: https://servicestack.net/ http://nancyfx.org + ASPNETCORE http://nancyfx.org ...
- python中常用模块
OS模块 python编程时,经常和文件.目录打交道,这是就离不了os模块.os模块包含普遍的操作系统功能,与具体的平台无关os.name()——判断现在正在实用的平台,Windows 返回 ‘nt' ...
- nginx 负载 问题
1 如果使用ip_hash,nginx必须为最前端负载均衡,如果大网环境部署,基本无法实现,内网还可以使用 2 如果不使用ip_hash,则要考虑session问题,可以使用memcached与tom ...
- <转载>ford-fulkerson算法2
原文链接https://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 作者:wlu 7. 网络流算法--Ford-Fulkerson ...
- appium+java(七)图片的放到及缩小操作
多点触控(MultiTouch) MultiTouch对象是触摸操作的集合. 多点触控手势只有两个方法,add和perform. add 用于将不同的触摸操作添加到当前的多点触控中. 当 perfor ...
- Python-Django-Ajax进阶
ajax上传文件: <h2>基于ajax上传文件</h2><p>名字 <input type="text" id="filena ...