js 回调函数详解

什么是回调函数?

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。

function foo(fn){
  fn();
}
function bar(){
  alert('good');
}
foo(bar);

因此callback 不一定用于同步,一般异步的场景下也经常用到回调,比如点击事件。

var dom = document.getElementById(id);
dom.addEventListener('click',function(){
  console.log('触发点击事件')
});

回调函数就是闭包

都能够我们将一个毁掉函数作为变量传递给另一个函数时,这个毁掉函数在包含它的函数内的某一点执行,就好像这个回调函数是在包含它的函数中定义的一样。这意味着回调函数本质上是一个闭包。

正如我们所知,闭包能够进入包含它的函数的作用域,因此回调函数能获取包含它的函数中的变量,以及全局作用域中的变量。

function onload(){
  var nm = 'onload';
  var dom = document.getElementById(id);
  dom.addEventListener('click',function(){
    console.log(nm)
  });
}
onload();

为回调函数绑定this

当回调函数是一个this对象的方法时,我们必须改变执行回调函数的方法来保证this对象的上下文。否则如果回调函数被传递给一个全局函数,this对象要么指向全局window对象(在浏览器中)。要么指向包含方法的对象。 

var obj = {
  nm:'obj'
}
function foo(fn,fnObj){
  fn.apply(fnObj);
}
function bar(){
  console.log(this.nm)
};
foo(bar,obj);

回调函数的优点和使用场景

优点

1. 避免重复代码。

2. 可以将通用的逻辑抽象。

3. 增强代码可维护性和可读性。

4. 分离专职的函数。

使用场景

1. 步调用(例如读取文件,进行HTTP请求,等等)。

2. 事件监听处理。

3. setTimeout和setInterval

4. 通用功能,简化逻辑

猜你喜欢

转载自blog.csdn.net/i13738612458/article/details/80204478