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. (转)java web 学习之路(学习顺序)

    第一步:学习HTML和CSS HTML(超文本标记语言)是网页的核心,学好HTML是成为Web开发人员的基本条件.HTML很容易学习的,但也很容易误用,要学精还得费点功夫. 随着HTML5的发展和普及 ...

  2. 石头剪刀布 R语言统计分析

    关于石头剪刀布,做出了详细的分析,具体ppt见地址 http://files.cnblogs.com/files/GMGHZ971322/R%E8%AF%AD%E8%A8%80.pptx 16级电商三 ...

  3. Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复(附带源码)

    摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化, ...

  4. 跨域访问之JSONP

    跨域 在平常的工作中常常会遇到A站点的需要访问B站点的资源. 这时就产生了跨域访问. 跨域是指从一个域名的网页去请求另一个域名的资源.浏览器遵循同源策略,不允许A站点的Javascript 读取B站点 ...

  5. 根据list得到list中的最大值最小值

    List ll = new ArrayList(); ll.add(new BigDecimal(1)); ll.add(new BigDecimal(4.99)); ll.add(new BigDe ...

  6. jeecg关闭当前iframe

    关闭当前iframe function closeDialog(){ frameElement.api.close();//本方法也行 //或者下面的方式 var win = frameElement ...

  7. JAX-RS REST 服务结果的自动封装

    如转发请注明: 原文luyiisme博客 当使用遵循 JAX-RS 标准的框架开发REST 服务时,我们倾向于定义个(含有JAX-RS)注解接口. 服务器端负责实现该接口,而客户端是该接口的代理进行远 ...

  8. touchmover手机移动端的拖动

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta name= ...

  9. Vijos 1040 高精度乘法

    描述 高精度乘法 输入:两行,每行表示一个非负整数(不超过10000位) 输出:两数的乘积. 样例1 样例输入1 99 101 样例输出1 9999 题解 这道题和之前的Vijos 1010 清帝之惑 ...

  10. VB6之HTTP服务器的实现

    之前用VBS写过一个,效率和支持比较low,这次闲着没事用VB重写了一次. 当前的实现版本仅支持静态文件的访问(*.html之类),支持访问方式为GET,HTTP状态支持200和404. 两个文件,一 ...