JavaScript中return一个函数与直接return一个函数变量的区别
声明:代码大部分出自《深入浅出-程序设计》
- 如果不熟悉闭包的同学,很容易弄混闭包的形成,以为是简单的函数嵌套。
- 闭包按照我的理解就是:函数与其中的自由变量、及引用环境。
1.函数嵌套且return一个函数
window.onload=function(){
function makeCounter(){ //第一层函数
var count = 0;
function counter(){ //嵌套函数
count = count +1;
return count;
}
return counter(); //将嵌套函数返回
}
var doCount = makeCounter();
console.log(doCount);
console.log(doCount);
console.log(doCount); //将结果重复输出三次
}
- 如果你对闭包一知半解,那么此时你就会认为,结果会输出1、2、3.
- 但结果是三个1.
- 原因很简单,当return counter()时,就自动调用了嵌套函数。
- 那么嵌套函数返回一个经过+1的count,并且count的值为1.
- 所以doCount得到的是一个数字,并不是函数,所以无法得到闭包。
- 还有同学会把doCount写成doCount();浏览器就会直接报错,因为doCount不是一个函数。
2.如何得到一个闭包呢,这里就要return counter
- 去了一个括号差别很大,先来看看代码
window.onload=function(){
function makeCounter(){ //第一层函数
var count = 0;
function counter(){ //嵌套函数
count = count +1;
return count;
}
return counter; //将嵌套函数返回,但只写函数名称
}
var doCount = makeCounter();
console.log(doCount());
console.log(doCount());
console.log(doCount()); //将结果重复输出三次
}
- 此时得到的就是1、2、3了
- 原因:
- return counter 返回的是整一个cunter()函数。
- 因此执行 var doCount = makeCounter()时,doCount将引用counter函数及其中的变量环境。
- 那么counter函数及其中的变量环境,就是我前面所说的闭包了。