(javascript)浅析js函数表达式和函数声明以及闭包

1.函数

定义函数的方法有两种 ,一种是 函数声明 ,另一种是 函数表达式 .
//函数声明
function f1(){}
//函数表达式
var f1=function(){}
这两者的区别在于:函数声明会在所有代码执行前进行解析,而函数表达式和声明变量一样都是执行到这里的时候才进行解析。(看例子)
f1()
var f1=function(){
  console.log(1)
}
Uncaught TypeError: f1 is not a function(…)
f1()//输出结果1
function f1(){
  console.log(1)
}
 
   

2.闭包

闭包就是能够读取其他函数作用域中的变量的函数。我们常见的闭包就是在一个函数中创建另外一个函数。(看例子)
//例子1
var f1=function(){
  var a=0;
  return function(){
    return a++;
  }
}() 
console.log(f1())   //输出0
console.log(f1())  //输出1
上面函数就是一个简单的闭包。 (再看一个例子)
//例子2
var f1=function(){
  var a=0;
  return function(){
    return a++;
  }
}
console.log(f1()()) //输出0
console.log(f1()()) //输出0
咦,是不有有点奇怪,看起来相同的两个例子会输出不同的结果?(让我们再看两个例子)
//例子3
var f1=function(){
  var a=0;
  console.log(123)
  return function(){
    return a++;
  }
}() 
console.log(f1()) 
console.log(f1())
//打印 123  0   1

 
    
//例子4
var f1=function(){
  var a=0;
  console.log(123)
  return function(){
    return a++;
  }
}
console.log(f1()())  
console.log(f1()()) 
//打印 123 0 123 0

 我们来解析一下:这两个例子中,例子3 因为在声明函数f1的时候已经自己执行了一次,所以我们可以把例子3看成: 
   
var f1=function(){
  return a++;   
}
//因为自动执行了一次,所以打印123 a是能访问外面的a,  a此时为0  
console.log(f1()) //打印 0
//调用的时候并没有打印 123,所以也没执行 var a=0; 此时 a=1
console.log(f1()) //打印 1
//我们可以看出 a一直存在局部变量中,并没有被回收 
/*为什么没被回收呢?因为父函数在执行后子函数被赋给了一个全局变量,
 而子函数是依附父函数的,所以就算之后没执行父函数,父函数也会存在内存中,
 不会被回收
*/

 
    
 怎么样,是不是知道这两个例子为什么打印的东西不一样了吧!!!!!是不是对闭包有点理解了~~ 
    



你可能感兴趣的:(javascript)