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. 一些JQuery使用技巧

    最近做项目,在使用JQuery中遇到一些问题记录下. 1.根据Id查询父级内容,或者父级的父级 之前会使用$("#id").parent().parent(): 这种使用有很大的弊 ...

  2. 检查服务器是否开启GD库

    1.把以下代码复制到记事本中并保存成A.php<?phpOb_end_flush();header ("Content-type: image/png");$im = @im ...

  3. 保存Druid的监控记录

    继上篇帖子之后 , 公司又要求将Druid Monitor的监控信息保存起来 , 因为Druid的监控记录在是缓存的,重启之后无法找回,所以需要做持久化,定期把监控记录转存到日志文件中 研究了半天 , ...

  4. 自己动手写一个自动登录脚本gg

    1.下载一个sshpass工具 2.安装sshpass,安装到tools文件夹 3.把tools文件夹的路径加入到/etc/bashrc vim   /etc/bashrc 最后一行  : expor ...

  5. .NET Core 2.0 Preview2 发布汇总

    前言 关于 ASP.NET Core 2.0 的新功能可以查看我的这篇博客. 这篇文章是 Priview2中的一些改进. .NET Core 2.0 - Preview2 Azure 的改进 Dock ...

  6. jquery取出所有包含class='engineer_val'的值

    $(".engineer_val").each(function(){ //jquery取出所有包含class='engineer_val'的值 $(); });

  7. 【Android Developers Training】 6. 配置Action Bar

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. Gist - ES6 Promise

    The concept of "Promise" Promise is used to asynchronous computations. Introduction " ...

  9. Linux之用户管理--初级上

    管理用户命令汇总 命令 注释说明(特殊颜色的必须掌握) useradd增 同adduser命令,执行此命令可在系统中添加用户.(更改4个用户文件) userdel删 执行此命令可删除用户及相关用户的配 ...

  10. 二、Solr单机版的搭建

    1.1. 运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本次使用Tocmat作为S ...