欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python闭包的原理_web前端:js 闭包原理

发布时间:2024/9/19 python 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python闭包的原理_web前端:js 闭包原理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

闭包包含自由(未绑定到特定对象)变量;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。"闭包"一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。

闭包的定义:闭包是指有权访问另一个函数作用域中的变量的函数--《Javascript高级程序设计》。

如何理解这句话:其实就是指在函数a外面能够访问函数a里面的函数b。

例如:

functiona(){

varv=123;

functionb(){

console.log(v);

}

returnb;

}

varb=a();

b();//123

执行函数a时把函数b返回,此时函数b就保存到了a的外面,这时候就可以在a函数的外部对b进行访问。

相关知识点:js作用域链

执行原理:

1、首先在预编译全局代码时,生成GO

GO{

a:functiona(){...},

b:undefined

}

2、执行varb=a();此时对a函数进行预编译并创建a函数的AO

AO{

v:undefined,

a:undefined,

b:functionb(){...}

}

3、创建a函数的作用域链

a.[[Scopes]]=[AO,GO];

4、由于函数的提升,会在a函数进行预编译的时候创建b函数的AO

bAO{}

b.[[Scopes]]=[AO(b),AO(a),GO]

5、执行varv=123;在js预编译中提到由于varv的声明已经得到了提升,所以此时只执行v=123;对AO里的v进行赋值。

AO{

v:123,

a:undefined,

b:functionb(){...}

}

6、之后将函数b返回,此时a函数执行完毕,a函数对应的AO理应销毁,但是由于在b函数中又对a函数的AO中的变量进行应用,所以a函数的AO不能被垃圾回收机制销毁,但是会跟a函数断开联系,当a函数再次执行,会重新创建一个a函数的AO。

7、在全局变量中使用b接收函数a的返回,此时GO变为

GO{

a:functiona(){...},

b:functionb(){...}

}

8、全局里的b

在b函数中打印v变量,由于b函数的AO中没有v变量,所以顺着作用域链往上找,在a的AO中找到v并打印。

闭包优缺点:

优点:

1、属性的私有化,在b返回后,处理b函数中能对v进行操作,其它地方都不能对v进行操作。

2、防止变量污染。

缺点:

容易造成内存泄漏,因为如果后期不对全局中的b进行处理(例如:赋值为null),a函数的AO会一直存在于内存中,如果多次调用a函数,容易导致内存中的垃圾数据越来越多造成内存泄漏。

在php、Scala、Scheme、CommonLisp、Smalltalk、Groovy、JavaScript、Ruby、Python、Go、Lua、objectivec、Swift以及java(Java8及以上)等语言中都能找到对闭包不同程度的支持。

总结

以上是生活随笔为你收集整理的python闭包的原理_web前端:js 闭包原理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。