(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
咦,是不有有点奇怪,看起来相同的两个例子会输出不同的结果?(让我们再看两个例子)
</pre><pre name="code" class="javascript">//例子3
var f1=function(){
  var a=0;
  console.log(123)
  return function(){
    return a++;
  }
}() 
console.log(f1()) 
console.log(f1())
//打印 123  0   1

</pre><pre name="code" class="javascript">
//例子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看成: 
 
</pre><pre name="code" class="javascript">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一直存在局部变量中,并没有被回收 
/*为什么没被回收呢?因为父函数在执行后子函数被赋给了一个全局变量,
 而子函数是依附父函数的,所以就算之后没执行父函数,父函数也会存在内存中,
 不会被回收
*/

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



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值