javascript 理解和使用回调函数
在javascript中,function是内置的类对象,也就是说它是一种类型的对象,可以和其他String、Array、Number、Objec类的对象一样用于内置对象的管理。因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(另一个)函数(function),在函数内部创建,从函数中返回结果值”。
因为函数名本身是变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
function callSomeFunction(someFunction, somaArgument) {
return someFunction(somaArgument);
}
function add(num) {
return num + 10;
}
var result1 = callSomeFunction(add, 10);
console.log(result1); // 20;
function getGreeting(name) {
return "hello "+ name;
}
var result2 = callSomeFunction(getGreeting, "world");
console.log(result2); // hello world;
这个calSomeFunction()函数是通用的,即无论第一个参数中传递进来的是什么函数,它都返回执行第一个参数后的结果。要访问函数的指针而不执行函数的话,必须去掉函数名后的那对括号。因此上面的列子中传递给callSomeFunction()的是add和getGreeting,而不是执行它们之后的结果。
下面我们再看几种回调函数。
在jQuery中常用的函数:
$("#btn").click(function() {
alert("Btn Clicked");
})
如上面的例子,我们传递了一个匿名函数给click方法的形参。click方法将会调用(或执行)我们传递给它们的回调函数。这个例子就是一个典型的回调函数的方式。
再看一个javascript的典型例子:
function callFunction(something) {
for (var item in something) {
console.log(item + ": " + something[item]);
}
}
function getSome(obj, callback) {
callback(obj);
}
getInput({name: "CSDN", lang: "Javascript"}, callFunction);
返回的结果是CSDN:Javascript。
讲callFunction作为参数传递给了getSome,在函数内,使用callback回调值,在calFunction中处理这个值。这样就形成了一个很好的函数处理过程。将各段处理都分开。
使用含有this对象的回调函数。当回调函数是一个含有this对象的方法时,我们必须修改执行回调函数的方法以保护this对象的内容。否则this对象将会指向全局的window对象,或者指向包含函数。
var obj = {
name: null,
setName: function (firstName, lastName) {
this.name = firstName + "-" + lastName;
}
}
function getName(firstName, lastName, callback) {
callback(firstName, lastName);
}
getName('Tom','Jony',obj.setName);
console.log(obj.name); // null
console.log(window.name); // Tom-Jony
当obj.setName被执行时,this.name 不会设置obj 对象的name,而是设置window对象中的name,因为getName是一个全局函数。出现这种现象是因为在全局函数中this对象指向了window对象。
这个时候我们可以使用Call和Apply函数保护this对象。
var obj = {
name: null,
setName: function (firstName, lastName) {
this.name = firstName + "-" + lastName;
}
}
function getName(firstName, lastName, callback, callbackObj) {
callback.call(callbackObj, firstName, lastName);
// callback.apply(callbackObj, [firstName, lastName]);
}
getName('Tom', 'Jony', obj.setName, obj);
console.log(obj.name); // Tom-Jony
这样就可以通过call函数正确的设置this对象,现在我们可以正确的执行回调函数并它正确地设置obj对象中的name。使用apply也是一样的。
多重回调函数也是可以得。一个典型的例子就是jQuery的ajax函数。
function successCallback() {
// Do stuff before send
}
function successCallback() {
// Do stuff if success message received
}
function completeCallback() {
// Do stuff upon completion
}
function errorCallback() {
// Do stuff if error received
}
$.ajax({
url:"http://favicon.png",
success:successCallback,
complete:completeCallback,
error:errorCallback
});
学习前端的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入前端学习交流群461593224,我们一起学前端!
javascript 理解和使用回调函数的更多相关文章
- 转·带你用实例理解C语言回调函数
原文出处:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 前言: 如不懂函数指针,请先查阅关于函数指针内容的资料(h ...
- 如何写JavaScript中的callback回调函数
如何写回调函数? 如果自己在写一个方法或函数,你有可能会遇到需要一个回调函数.下面就是一个简单的常见回调函数例子: function mySandwich(param1, param2, callba ...
- 理解 JavaScript 回调函数并使用
JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- [转]理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 【JavaScript】理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- 理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- Javascript 回调函数理解---二娃子买肾机6
在Javascript中什么是回调函数,我认为简单来说就是把一个函数B作为参数传递给另一个函数A,在A函数中的一定时机调用函数B. 这里可以看出回调函数形成了一个闭包,它可以访问函数A中的活动对象. ...
随机推荐
- Java课程设计---数据库工具类
接下来看看传统的查询方式(一个完整的查询) package com.java.mysql; import java.sql.Connection; import java.sql.DriverMana ...
- 实用TCP协议(1):TCP 协议简介
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议.TCP 协议假设下层协议可以提供简单的不可靠数据报, 并在此基础 ...
- 设置vim永久显示编号
永久显示行号,需要我们设置配置文件,两种配置方式: 1. /etc/vimrc 是系统范围的初始化配置 2. -/.vimrc 个人的vim初始化配置 编辑配置文件,以个人为例: vi ...
- appium1-macOS10.12下如何丝滑的使用appium?
1.下载或者更新Homebrew:homebrew官网 macOS 不可或缺的套件管理器 $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githu ...
- LeetCode-102-二叉树的层序遍历
二叉树的层序遍历 题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:ht ...
- Linux CentOS7.X-目录切换
一.cd 命令 在Linux中,进行目录的切换需要使用cd命令. 二.Linux目录结构 三.Linux CentOS7中几个常用目录切换方式 1.cd usr 切换到当前目录下的usr目录. 2. ...
- Mattermost Server安装及配置AD/LADP
一.安装Mattermost Server Mattermost is an open source, self-hosted Slack-alternative. 1.下载mattermost s ...
- linux作业--第六周
1.编写脚本实现登陆远程主机.(使用expect和shell脚本两种形式). #expect方式 yum -y install expect vim remote_ssh.sh #!/usr/bin/ ...
- 伪静态 伪装成静态的网址,只是改变URL的表现形式,实际上还是动态页面
路由 Route::get('/list_{id}.html','newsController@listoNewone'); 页面详情 <table class="table" ...
- tensorflow源码解析之framework-device
目录 什么是设备 设备属性描述 device_base 关系图 涉及的文件 迭代记录 1. 什么是设备 "设备"是一个很容易引起混淆的概念,在TF中,设备device专指能够执行实 ...