<script>
// 写一个闭包函数
function Bigsum(arr){
var middlesum=function bottomsum(){
return arr.reduce(function lastsum(a,b){
return a+b
});
//arr.reduce()函数是把数组中的元素进行累加,然后返回累加结果。
}
console.log("middlesum="+middlesum);
return middlesum;
}
// 这个时候我们调用一下这个函数,传点值给他
var a=Bigsum([1,2,3,4,5])
//打印一下a看看它是不是等于15
console.log("a="+a)
//显示为
// a=function bottomsum(){
// return arr.reduce(function lastsum(a,b){
// return a+b
// });
//
// }
// 发现不等于15,这是为什么呢,我们回到函数中去,发现了一句return middlesum,
// 我们去打印一下middlesum看看它到底等于什么
// console.log("middlesum="+middlesum);
// 把上面这句放到return middlesum前面(上面我已经写出)
// 打印出
// middlesum=function bottomsum(){
// return arr.reduce(function lastsum(a,b){
// return a+b
// });
//
// }
// 这就能说得通为什么a=function bottomsum(){
// return arr.reduce(function lastsum(a,b){
// return a+b
// });
// 这是将function bottomsum()当作的一个式子,而没真正调用这个函数,那要怎么才是正确的呢
// 第一种方法,
// 改为 return middlesum();//返回的是这个函数的返回值
// console.log("a="+a)//显示为15
// 第二种方法
var b=a();
// 相当于重新确认a为一个函数,而不是一个变量,然后调用a函数,
console.log("b="+b)//显示为15
// 第三种方法
console.log("a="+a())//显示为15
// 总结一下,像这种我们在函数Bigsum中又定义了函数middlesum,并且,内部函数sum可以引用外部函数Bigsum的参数和局部变量,
// 当Bigsum返回函数middlesum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
// 请再注意一点,当我们调用Bigsum时,每次调用都会返回一个新的函数,即使传入相同的参数:
var a1=Bigsum([1,2,3,4,5])
console.log("a1="+a1())
console.log("a===a1吗:",a===a1)//a===a1吗: false
// a()和a1()的调用,每次都像新的一样互不影响
</script>