理解javascript 回调函数,闭包

回调

jQuery中一直有使用回调函数,比如:

$("#btn").click(function() {
  alert("button clicked");
});

example1:

       methods: {
            getClassDetail(toastTip) {
                this.$http.get('/StudyPlan/GetClassInfo?classId=' + classid + '&userId=' + userid + '&timezone=' + _self.timezone, {
                })
                    .then(function (response) {
                    //回调函数 toastTip存在才执行,相当于if( toastTip){ toastTip();}
                        toastTip && toastTip();
                    })
                    .catch(function (error) {
                    });
            },
     }
  this.getClassDetail(function () { Toast('已退出班级'); });

example2:

function add(num1, num2, callback){
	var sum = num1 + num2;
	callback(sum);
}

function print(num){
	console.log(num);
}

add(1, 2, print);		//=>3

example3:

匿名回调函数

function add(num1, num2, callback){
	var sum = num1 + num2;
	callback(sum);
}

add(1, 2, function(sum){
	console.log(sum);		//=>3
});

回调函数理解:

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

回调函数特点:

  • 不会立刻执行

回调函数作为参数传递给一个函数的时候,传递的只是函数的定义并不会立即执行。和普通的函数一样,回调函数在函调用函数数中也要通过()运算符调用才会执行。

  • 是个闭包

回调函数是一个闭包,也就是说它能访问到其外层定义的变量。

  • 执行前类型判断

在执行回调函数前最好确认其是一个函数。

function add(num1, num2, callback){
	var sum = num1 + num2;
	if(typeof callback === 'function'){//类型判断,确认是一个函数
		callback(sum);
	}
}

闭包(含义:就是能够读取其他函数内部变量的函数。)

  • 参考链接阮一峰讲闭包

  • 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

  • 使用场景:从外部读取局部变量

有时候需要得到函数内的局部变量。但是,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。

 function f1(){

    var n=999;

    function f2(){
      alert(n); // 999
    }

  }

函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。

这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

 function f1(){
    var n=999;
    
    function f2(){//f2函数,就是闭包
      alert(n); 
    }
    return f2;
    
  }
  
  var result=f1();
  result(); // 999
  • 闭包的用途:最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。

猜你喜欢

转载自blog.csdn.net/wcy7916/article/details/82685138
今日推荐