【javascript】回调函数

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));
计划、执行、每天高效的活着学着
原文地址:https://www.cnblogs.com/huxiaoyun90/p/4149543.html