1. 定义

回调函数,即当条件满足时执行的函数。有三种方法实现调用回调函数 call

1)call

用法:call(thisObj, Obj)

主要区别:call 方法会将函数对象上下文修改为thisObj 指定的新对象。如果无thisObj , 则thisObj 为Global 对象

参数为单个,即obj

2) apply

用法:apply(thisObj, [argArray])
主要区别:call 方法会将函数对象上下文修改为thisObj 指定的新对象。如果无thisObj , 则thisObj 为Global 对象

参数为数组,可多个

3) $.proxy  

用法:$.proxy(thisObj, context)  或 $(select).proxy(context, name)

主要区别:jquery利用call,apply的实现的替换指定上下文

2. 例子

// 简单函数对象替换
function add(a, b) {
console.log('i am callFunc1, this: ', a+b);
console.log(this);
} function sub() {
console.log('i am callFunc2, this: ', a-b);
console.log(this);
} add.call(sub, 5, 4); // 此时执行add 函数,其this 对象转变为sub 函数
add.apply(sub, [5, 4]); // 对象替换
function Animal(name){
this.name = name;
this.showName = function(){
console.log(this);
console.log(this.name);
}
} function Cat(name){
this.name = name;
} var animal = new Animal("animal");
var cat = new Cat("cat"); //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
animal.showName.call(cat,","); //执行showName 函数时,this对象已为cat 对象,所以输入结果为"Cat"
animal.showName.apply(cat,[]); // 对象继承
function Animal(name){
this.name = name;
this.age = 14;
this.showName = function(){
console.log(this);
console.log(this.name);
}
} function Cat(name){
Animal.call(this, name); // 通过call 方法继承Animal 对象的函数及属性
} var cat = new Cat("Cat");
cat.showName();

3. 长得有点像的方法

1)caller

用法:func.caller

主要区别:返回调用该函数的上层函数,如果没有上层函数,则返回null, 个人感觉没啥用

// caller 的用法
function add(a, b) {
console.log('i am add , result: ', a+b);
if (add.caller) {
console.log('add caller: ',add.caller.toString());
}else {
console.log("this is a top function");
}
sum(a, b);
}
function sub(a, b) {
console.log('i am sub , result: ', a-b);
add(a, b);
} function sum(a, b) {
console.log('i am sum , result: ', a+b);
if (sum.caller) {
console.log('sum caller: ',sum.caller.toString());
}else {
console.log("this is a top function");
}
}
add(3, 4); // 将仅输出结果,因为此时add 为第一层方法
sub(3, 4); // 将仅输出结果和上一层 方法,因为此时add 的上层方法为sub, sum 的上层方法为add

2)callee

用法:arguments.callee

主要区别:返回正在执行的函数,可用于写递归

// callee 的用法
//用于验证参数
function calleeLengthDemo(arg1, arg2) {
console.log(arguments.callee);
if (arguments.length==arguments.callee.length) {
console.log("验证形参和实参长度正确!");
return;
}else {
console.log("实参长度:" +arguments.length);
console.log("形参长度: " +arguments.callee.length);
}
}
calleeLengthDemo(4, 4, 8); // 使用callee实现递归计算
var sum = function(n) {
if (n == 1){
return 1;
}else {
return n + arguments.callee(n - 1);
}
}
console.log(sum(4)); // 一般的递归函数:
var sum = function(n){
if (1==n) {
return 1;
}else {
return n + sum (n-1);
}
}
console.log(sum(4));

【javascript】回调函数的更多相关文章

  1. 理解 JavaScript 回调函数并使用

    JavaScript中,函数是一等(first-class)对象:也就是说,函数是 Object 类型并且可以像其他一等对象(String,Array,Number等)一样使用.它们可以"保 ...

  2. 【JavaScript】JavaScript回调函数

    什么是Javascript 回调函数? 函数和其他数据一样可以被赋值,删除,拷贝等,所以也可以把函数作为参数传入到另一个函数中. 这个函数就是所谓的回调函数   举例: //不带参数的case fun ...

  3. 理解javascript 回调函数

    ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不 ...

  4. JavaScript回调函数的实现

    https://github.com/forsigner/blog/blob/master/source/_posts/javascript-callback.md 在JavaScript中,回调函数 ...

  5. JavaScript回调函数及数组方法测试

    JavaScript回调函数及数组方法测试 具体代码如下: <!DOCTYPE html> <html lang="en"> <head> &l ...

  6. 如何定义 Java 的回调函数,与 JavaScript 回调函数的区别

    JavaScript 中的回调函数 在 JavaScript 中经常使用回调函数,比如:get 请求.post 请求等异步任务.在我们请求之前以及请求之后,都需要完成一些固定的操作,比如:请求之前先从 ...

  7. JavaScript回调函数的理解

    这里是个人对回调函数的一段理解 <!DOCTYPE html> <html> <head> <title>回调函数</title> < ...

  8. 关于javascript 回调函数

    http://segmentfault.com/q/1010000000212522 如何避免Javascript中回调函数的嵌套? http://javascript.ruanyifeng.com/ ...

  9. javascript 回调函数应用

    回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你”这是一个异步 ...

  10. javascript回调函数笔记

    来源于:https://github.com/useaname/blog-study 在Javascript中,函数是第一类对象.意味函数可以像对象一样按照第一类被管理使用.回调函数是从一个叫函数式编 ...

随机推荐

  1. 聊聊AngularJs

    大家好! 今天我们要说的就是我们的AngularJs 当然呢!我们Angular呢! 1.是一个MVC框架,如果我们说他是一个mvc的框架呢!就是有些不太具体了,其实他是我们的MVC的扩展版 当然他具 ...

  2. jQuery 插件 的this 指向问题(实战)

    daterangepicker 是一个JavaScript组件,用来选择日期. 资源直接搜索 daterangepicker 即可,当然好看的样式可以基于Bootstrap. 官网:http://ww ...

  3. [BZOJ4518]征途

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MB Description Pine开始了从S地到T地的征途. 从S地到T地的路可以 ...

  4. vue-router单页应用简单示例(二)

    我们先来理一下思路. 图1:main.js 引入vue,App.vue,router/index.js文件 声明要渲染的Id为app,将App.vue中的模版渲染到入口界面(就是打开localhost ...

  5. 学习mysql语法--基础篇(一)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分:    一.创建用户,创建数据库,给 ...

  6. java 生产者 与 消费者的案例

    主要理解了两个问题 1.线程数据同步的问题 2.线程交替运行的方式 package ThreadDemo; /** * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题) * @au ...

  7. [图形学] Chp8 使用双缓存创建帧动画

    第八章的习题有动画的要求,之前并没有讲解动画如何制作,网上搜到一篇文章SCARA——OpenGL入门学习五六(三维变换.动画),按照里面的方法,使用双缓存和空闲回调函数实现了一个简单的帧动画. #in ...

  8. Vysor破解助手for Linux/macOS/Windows

    Vysor更新到1.7.8后,之前的破解工具又失效了,但破解的方法依然可用.在更新破解工具的过程中,Vysor又出了1.7.9版本,主要是对Android O做了处理.更新后的破解工具支持1.6.6~ ...

  9. windows平台python 2.7环境编译安装zbar

    最近一个项目需要识别二维码,找来找去找到了zbar和zxing,中间越过无数坑,总算基本上弄明白,分享出来给大家. 一.zbar官方介绍 ZBar 是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图 ...

  10. 实时音视频互动系列(上):又拍云UTUN网络详解

    如何定义实时音视频互动, 延迟 400ms 内才能无异步感 实时音视频互动如果存在1秒左右的延时会给交流者带来异步感,必须将视频播放延迟限制在400ms以内,才能给用户较好的交互体验. 当延迟控制在4 ...