在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
因此callback 不一定用于异步,一般同步(阻塞)的场景下也经常用到回调,比如要求执行某些操作后执行回调函数。
1.基本方法
例子
一个同步(阻塞)中使用回调的例子,目的是在func1代码执行完成后执行func2。
var func = function(callback){
//do something.
(callback && typeof(callback) === "function") && callback();
};
var target = function(){
alert("callback");
};
func(target);
或者匿名函数的方式
var func = function(callback){
//do something.
(callback && typeof(callback) === "function") && callback();
};
func(function(){
alert(2);
});
2. 高级方法
使用call方法
function Person(name){
this.name = name;
}
Person.prototype.doSomething = function(callback){
(callback && typeof(callback) === "function") && callback.call(this);
};
function foo(){
alert(this.name);
}
var person = new Person('Joe');
person.doSomething(foo);
传参数
function Person(name){
this.name = name;
}
Person.prototype.doSomething = function(callback, age){
(callback && typeof(callback) === "function") && callback.call(this, age);
};
function foo(age){
alert("name:" + this.name + "\nage:" + age);
}
var person = new Person('Isaac');
person.doSomething(foo, 100);
3. 得到callback是字符串
有的时候,callback可能是一个参数,这样获得的callback可能会是一个字符串;
这个时候就需要使用 eval()方法,把字符串转义成function
var func = function(callback){
if(!callback) return;
typeof(callback) === "string" && (callback = eval(callback));
typeof(callback) === "function" && callback();
};
var target = function(){
alert("target");
};
func("target");
单体
var sin = {
fn: function(){
alert("sin.fn()");
}
};
sin.pa = {
fn: function(){
alert("sin.pa.fn()");
}
};
var func = function(callback){
if(!callback) return;
typeof(callback) === "string" && (callback = eval(callback));
typeof(callback) === "function" && callback();
};
func("sin.fn");
func("sin.pa.fn");
先记录这些,之后如果碰到新的情况再继续补充~