js闭包

实习大半年一直都在疯狂地产出垃圾代码,现在有时间梳理理解一下js中的一些概念。看过网上很多说闭包的博客,依然一知半解。于是动手敲了一些自己能想到的函数的形式,进行比较区别。下面谈谈我的理解。


javascript高程上对闭包的定义:闭包是指有权访问另一个函数作用域中的变量的函数。

首先谈谈我们平时写的函数

function f1() {

var num = 1;

  num ++;

return num;

}

var result = f1();

result;//2

result;//2 

这里result是一个变量值,f1()每次执行完之后都进行了自动销毁,num变量被垃圾机制回收。


在看一个函数嵌套函数的例子

function f1() {

var num = 1;

function f2() {

num ++;

return num;

}

};

var result = f1();

result;// undefined

在f1函数中声明了f2,并没有调用,所以不会执行。


添加一行调用f2的代码看一下运行结果

function f1() {

var num = 1;

function f2() {

num ++;

return num;

}

console.log(f2());

};

var result = f1();

2

result;// undefined

f2执行了,num值加1,但是f1函数并没有返回值。所以result的值为undefined。


那么问题来了,如果我在外部想取到f2中的num值,且希望每次num值增加过后再次调用会在原有基础上改变,而不是每次都初始化,怎么办呢。这就需要用到闭包。

闭包的形式简单来说,就是函数嵌套函数,内部函数作为外部函数的返回值。对外部变量采用的原型链引用的方式,并非值传递,所以每次修改都会对其产生影响,之后的每次引用都不会被初始化。

看一个例子:

function f1() {
   var num = 1;
     return function f2() {
     num ++;
     console.log(num);
}
}

var result = f1();
result;

输出结果:function f2() {
     num ++;
     console.log(num);
}
result();//2

result();//3

从上面代码可以看出,result是一个function,在函数f1外部定义result变量,可以访问其内部环境变量,同时函数执行完之后变量依然保存在内存中,不会被销毁。

可以通过执行 result = null解除对f2函数的引用,释放内存。


以上就是我对闭包的理解,有理解不当的地方欢迎指出。希望大家都可以动手敲一下代码,加深对闭包的理解。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值