闭包函数记录

闭包函数

第一次注意到这个称谓,是在听到公司大佬和别人看代码的时候,虽然实际中我还没有运用过(可能用过,但自己不明所以,或者是复制的代码),所以记录一下自己百度下来的结果

闭包函数的定义:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包函数。

闭包是一种环境,具体是:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

闭包的特点
让外部访问函数内部变量成为可能;
局部变量会常驻在内存中;
可以避免使用全局变量,防止全局变量污染;
会造成内存泄漏(有一块内存空间被长期占用,而不被释放)

function func(){
var index = 0;
function add(){
	Debug.Log(index++);
}
return add;
}

var Add = func();
Add();//1
Add();//2
Add();//3
var Add2 = func();//每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址
Add2();//1
Add2();//2
Add2();//3

其中方法func是外部函数,方法add为内部函数,也叫闭包函数。因为func返回的是一个方法,所以将其赋值给变量Add,并调用。

在此强调,index必须在func内部,否则作为全局变量,不形成闭包。

//调用改成如此
var Add = func();
Add();//1
Add();//2
Add();//3
var Add2 = func();
Add2();//4
Add2();//5
Add2();//6

此外,还看到如下关于闭包的示例


var add = function(x) { 
  var sum = 1; 
  var tmp = function(x) { 
      sum = sum + x; 
      return tmp;    
  } 
  tmp.toString = function() { 
      return sum; 
  }
  return tmp; 
} 
alert(add(1)(2)(3));

初看有点绕,其实第一遍add(1)里面定义了tmp方法,且返回值是temp,故add(1)(2)其实是temp(2),返回值也是temp,sum+=x也被执行 ,以此类推。

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
### JavaScript 闭包函数的实际应用场景 #### 应用场景一:保持状态 闭包能够捕获并保存外部函数中的变量,即使该外部函数已经执行完毕。这种特性允许我们在不同的调用之间共享和维护某些数据。 ```javascript function createCounter() { let count = 0; // 外部函数的局部变量 return function () { // 返回内部函数作为闭包 return count++; // 访问并修改外部变量 }; } const counter = createCounter(); console.log(counter()); // 输出: 0 [^1] console.log(counter()); // 输出: 1 [^1] ``` 上述代码展示了如何利用闭包来创建一个计数器函数 `createCounter`,它返回另一个函数用于增加计数。 --- #### 应用场景二:模拟私有方法 通过闭包可以在对象中定义无法被外界访问的方法或属性,从而实现封装性和安全性。 ```javascript function Person(name) { const privateName = name; // 私有变量 this.getName = function () { // 使用闭包暴露公共接口 return privateName; }; this.setName = function (newName) { privateName = newName; // 修改私有变量 }; } const person = new Person('Alice'); console.log(person.getName()); // 输出: Alice [^2] person.setName('Bob'); console.log(person.getName()); // 输出: Bob // 尝试直接访问私有成员失败 console.log(person.privateName); // undefined ``` 此例子说明了如何借助闭包隐藏类实例的状态,并仅提供受控的方式对其进行操作。 --- #### 应用场景三:延迟计算与惰性求 闭包可用于推迟某项昂贵运算直到真正需要的时候才去完成。 ```javascript function lazySum(a, b) { const sum = a + b; // 预先计算结果 return function () { // 延迟返回结果 console.log(`The result is ${sum}`); [^3] return sum; }; } const computeLater = lazySum(5, 7); computeLater(); // The result is 12 [^3] ``` 这里展示了一个简单的懒加载模式,在首次调用时才会打印最终的结果。 --- #### 应用场景四:事件处理程序绑定上下文 当为 DOM 元素附加多个点击监听器时,可以通过闭包存储每次迭代的具体参数。 ```html <ul id="list"> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> <script> document.getElementById('list').addEventListener('click', function(event){ if(event.target.tagName === 'LI'){ alert(event.target.textContent); } }); </script> ``` 尽管这段 HTML 和脚本未显式涉及闭包,但在实际开发过程中常需结合循环动态设置独立的行为逻辑,此时便需要用到闭包机制。 --- #### 应用场景五:模仿块级作用域(ES6之前) 在 ES6 的 `let` 关键字引入前,开发者常用闭包解决因变量提升而导致的问题。 ```javascript for (var i = 0; i < 3; i++) { setTimeout((function(j){ // 创建立即执行函数表达式(IIFE),形成新的作用域 return function(){ console.log(j); }; })(i), 100 * i); } // 正确输出: 0, 1, 2 而不是全都是3 ``` 以上片段演示了如何利用 IIFE 来防止全局污染以及确保每个定时器拥有自己的副本索引。 --- #### 应用场景六:缓存已知结果(记忆化技术) 对于重复调用相同输入的情况,可采用闭包记录历史查询以提高性能。 ```javascript function memoizedFibonacci() { const cache = {}; // 缓存表 return function fib(n) { if (n in cache) return cache[n]; // 如果存在则直接返回 if (n <= 1) return n; cache[n] = fib(n - 1) + fib(n - 2); // 否则递归计算并储存 return cache[n]; }; } const fastFib = memoizedFibonacci(); console.log(fastFib(10)); // 输出: 55 并且后续更快 ``` 这个案例体现了闭包的强大功能——不仅限于控制流管理还能优化算法效率。 --- ### 总结 JavaScript 中的闭包是一种强大的工具,广泛应用于各种编程需求之中。无论是维持跨多次调用间的数据一致性还是增强代码的安全性与模块化程度,都可以看到它的身影。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值