闭包相关知识

什么是闭包/闭包的含义?
闭包是指有权访问另一个函数作用域中的变量。创建闭包的常见方式,就是在一个函数内部创建另一个函数。
闭包就是能够读取其他函数内部变量的函数。即重用变量,又保护变量不被污染的一种机制。
(1)闭包外层是一个函数
(2)闭包内部都有函数
(3)闭包会return内部函数
(4)闭包返回的函数不能有return
(5)执行闭包后,闭包内部的变量会存在,而闭包内部函数的内部变量不会存在
创建闭包的步骤:
1)用外层函数包裹受保护的变量和操作变量的内层函数
2)外层函数将内层函数返回
3)使用者调用外部函数,获得内层函数的对象

function output() {
	for (var i = 0; i < 3; i++) {
		 (function(j) {
		    setTimeout(function timer() {
		        console.log(j);
		    }, 1000);
		})(i);
	}
}
<div id="container">
	<button>按钮1</button>
	<button>按钮2</button>
	<button>按钮3</button>
</div>
<script>
var list=container.querySelectorAll('button');
for(var i=0;i<list.length;i++){
	var bt=list[i];
	bt.onclick=(function(i){
		return function(){
			console.log(i);
		}
	})(i)
	//或者
	bt.onclick=outer(i);
}
//点击的时候调用函数打印出来的是i
//创建了三个函数
//变量i只有一个
//闭包对象:一个数据(i)+三个函数
function outer(num){
	function inner(){
		console.log(num);
	}
	return inner;
}
</script>

闭包的特性,对页面的影响?
闭包特性:
(1)作为函数变量的一个引用。当函数返回时,其处于激活状态。
(2)闭包就是当一个函数返回时,并没有释放资源的栈区。
对页面的影响:
使用闭包可以做很多事情,比如模拟面向对象的代码风格;更优雅、更简洁的表达出代码;在某些方面提升代码的执行效率。
闭包的作用和原理:
因为闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。
多个函数可以使用一个相同的环境,这使得他们可以通过改变那个环境相互交流。
使用的场景:
(1)采用函数引用方式的setTimeout调用
(2)将函数关联到对象的实例方法。
(3)封装相关的功能集。
闭包的好处和坏处:
闭包的好处:
(1)逻辑连贯,当闭包作为另一个函数调用参数时,避免脱离当前的逻辑而单独编写额外逻辑。
(2)方便调用上下文的局部变量
(3)加强封装性,可以达到对变量封装的作用
闭包的坏处:
比一般的函数占用更多的内存,浪费内存,浪费内存不仅仅因为它常驻内存,更重要的是,对闭包的使用不当会造成无效的内存的产生。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Swift 中的闭包是一个自包含的函数代码块,可以在代码中被传递和使用。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。Swift 中的闭包类似于 C 和 Objective-C 中的 blocks、以及其他一些编程语言中的 lambdas。 闭包有以下三种形式: 1. 全局函数,有名字但不能捕获任何值。 2. 嵌套函数,有名字,也能捕获其封闭函数内的值。 3. 闭包表达式,没有名字,使用轻量级语法,可以捕获上下文中的值。 闭包表达式的基本语法如下: ``` { (parameters) -> return type in statements } ``` 其中 `parameters` 为参数列表,可以为空;`return type` 为返回类型,也可以为空;`statements` 为闭包体,包含了要执行的代码。 例如,下面的代码定义了一个接受两个整数参数并返回它们之和的闭包: ``` let sum = { (a: Int, b: Int) -> Int in return a + b } ``` 可以像函数一样调用这个闭包: ``` let result = sum(1, 2) print(result) // 输出 3 ``` 闭包可以作为函数的参数或返回值。例如,下面的代码定义了一个接受一个整型数组和一个闭包参数的函数 `apply`: ``` func apply(_ array: [Int], _ transform: (Int) -> Int) -> [Int] { var result = [Int]() for element in array { result.append(transform(element)) } return result } ``` 可以使用闭包表达式作为 `transform` 参数传递: ``` let numbers = [1, 2, 3, 4, 5] let squared = apply(numbers, { (number) -> Int in return number * number }) print(squared) // 输出 [1, 4, 9, 16, 25] ``` 闭包还支持尾随闭包语法,可以将闭包表达式作为函数的最后一个参数传递,并将其放在圆括号之外。例如,上面的代码也可以写成: ``` let squared = apply(numbers) { (number) -> Int in return number * number } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值