闭包的写法

   // for(var i=0;i<data.length;i++){
            //       var eles = document.getElementsByClassName('a_priceList');
            //       (function(i){
            //           eles[i].onclick = function(){
            //               console.log(eles[i].getAttribute('id'));
            //               selectedClickBack && typeof selectedClickBack=="function"&& selectedClickBack();
            //           }
            //       })(i);
            // }; 

  

转载于:https://www.cnblogs.com/jtjds/articles/7007210.html

### Python 闭包的定义 在 Python 中,闭包是一种特殊的函数结构,它允许内嵌函数引用并保存其外部作用域中的变量。这种机制使得内部函数能够在外部函数执行完成后仍然访问和操作这些变量[^1]。 具体来说,当一个函数返回另一个函数时,如果该内部函数引用了外部函数的作用域中的局部变量,则会形成一个闭包闭包的核心在于它可以“记住”创建它的上下文环境,从而保持对外部变量的持久化引用[^2]。 --- ### Python 闭包写法 以下是构建 Python 闭包的一个典型例子: ```python def outer_function(x): def inner_function(y): return x + y # 访问外层函数的参数 `x` return inner_function closure = outer_function(10) # 返回的是 inner_function 的实例 result = closure(5) # 调用 inner_function 并传入参数 `y=5` print(result) # 输出 15 ``` 在这个例子中,`inner_function` 是一个闭包,因为它引用了来自外部作用域的变量 `x`。即使 `outer_function` 已经完成执行,`inner_function` 依然能够访问到 `x` 的值[^4]。 --- ### Python 闭包的实际用途 #### 1. **实现装饰器** 闭包常被用来设计装饰器,这是一种用于增强或修改其他函数行为的设计模式。例如: ```python def my_decorator(func): def wrapper(*args, **kwargs): print("Before function call") # 添加额外的功能 result = func(*args, **kwargs) print("After function call") return result return wrapper @my_decorator def greet(name): print(f"Hello {name}") greet("Alice") ``` 在这里,`wrapper` 函数形成了一个闭包,它保留了对原始函数 `func` 的引用,并在其基础上增加了新的逻辑[^3]。 #### 2. **惰性计算** 闭包也可以用于延迟某些昂贵的操作直到必要时刻才被执行。例如: ```python def lazy_addition(a, b): def add(): return a + b return add adder = lazy_addition(3, 7) print(adder()) # 延迟计算直到调用 adder() ``` 此代码片段展示了如何通过闭包来推迟加法运算的时间点。 #### 3. **数据封装** 利用闭包可以隐藏敏感的数据成员,防止它们被意外更改。例如: ```python def counter(): count = 0 # 外部作用域中的变量 def increment(): nonlocal count count += 1 return count return increment counter_instance = counter() print(counter_instance()) # 输出 1 print(counter_instance()) # 输出 2 ``` 这里,`count` 变量被封闭在 `increment` 函数之内,只有通过调用 `increment()` 才能改变它的值[^1]。 --- ### 使用闭包需要注意的地方 尽管闭包功能强大,但在实际应用过程中也需要留意潜在的风险。例如: - 如果闭包持有的对象占用大量内存资源,可能会导致不必要的内存消耗甚至泄露问题[^3]。 - 当多个闭包共享同一个可变状态时,容易引起不可预期的行为,因此建议尽量减少全局或者自由变量的数量[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值