functionmakeAdder(count){functionadd(num){return count + num
}return add
}var add10 =makeAdder(10)
console.log(add10(5));
2.4、闭包的内存泄漏
那么我们为什么经常会说闭包是有内存泄露的呢?
在上面的案例中,如果后续我们不再使用add10函数了,那么该函数对象应该要被销毁掉,并且其引用着的父作用域 AO 也应该被销毁掉;
但是目前因为在全局作用域下add10变量对0xb00的函数对象有引用,而0xb00的作用域中 AO (0x200)有引用,所以最终会造成这些内存都是无法被释放的;
所以我们经常说的闭包会造成内存泄露,其实就是刚才的引用链中的所有对象都是无法释放的;
那么,怎么解决这个问题呢?
因为当将add10设置为 null 时,就不再对函数对象0xb00有引用,那么对应的 AO 对象0x200也就不可达了;
在 GC 的下一次检测中,它们就会被销毁掉;
add10 =null
2.5、JS闭包内存泄漏案例
functiontestArray(){var arr =newArray(1024*1024).fill(1)returnfunction(){
console.log(arr.length);}}var arrFns =[]for(var i =0; i <100; i++){setTimeout(()=>{
arrFns.push(testArray())},100* i)}setTimeout(()=>{for(var i =0; i <50; i++){setTimeout(()=>{
arrFns.pop()},100* i)}},10000)
2.6、AO不使用的属性
我们来研究一个问题: AO 对象不会被销毁时,是否里面的所有属性都不会被释放?
下面这段代码中 name 属于闭包的父作用城里面的变量;
我们知道形成闭包之后 count 一定不会被销毁掉,那么 name 是否会被销毁掉呢?
这里我打上了断点,我们可以在浏览器上看看结果;
functionmakeAdder(count){let name ='why'returnfunctionadd(num){debuggerreturn count + num
}}var add5 =makeAdder(5)
console.log(add5(5));
console.log(add5(10));
思路
一方面考察自连接,另一方面考察group by
这里主要说明 group by 用法:
1.在 SQL 查询中,GROUP BY 子句用于将结果集中的行分组,目的通常就是 对每个组应用聚合函数(如 SUM(), AVG(), MAX(), MIN(), COUNT() 等…
1、在向文件夹中保存数据前,先判断该文件夹(路径)是否存在。 save_path /root/.../image/result
if not os.path.exists(save_path):os.makedirs(save_path) 本来路径里只有到image文件夹的,执行完后会自动在image下创建result文件夹。
2、在打开某些图…
如下图,读取每行文本,每行文本再按空格分开读取一个字符串,输出到另一个文本: CAD环境下,代码如下:
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using System;
using Sys…