js神奇的闭包

闭包的定义
在这里插入图片描述
百度百科上是这么说的。闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
我们看一个最简单的例子

function d(){
    
    
    var b = 11;
    function v(){
    
    
        return b++
    }
    return v
}

这就是一个常见简单的闭包,子函数读取了父函数内部的局部变量。
我们来看另一个例子

(function(){
    
    
	let d = 22;
	function b(){
    
    
		return	d++
	}
})

这是闭包吗?
这也是一个闭包,依然满足闭包的定义。
在平时写代码的时候,其实我们也会不经意间用到闭包。
总结俩点;
一、函数嵌套。
二、访问其他函数内部变量。
闭包的缺点。
容易污染内存。
这一点说重要也很重要。
我们在使用闭包的时候,如果那个函数是一个一直都有需要使用的函数,那么也就不会存在内存占用污染的说法。
但是如果是一些不经意间使用的闭包,而且没有多次使用的。那这造成了污染。
所以要善于观察,发现这种情况进行变量清空就好了。

------------------------------------------手动分割奥--------------------------------------------------------
上面只是对于闭包的重要概念,进行的解释。

后面我又阅读过了你不知道的js里对闭包的解释
还是像之前说的一样的,在我们写的代码中无时无刻都存在这闭包,只是我们没有认出来这是闭包而已。
看代码

function wait(message) {
    
    
 setTimeout( function timer() {
    
    
 	console.log( message );
 }, 1000 );
}
wait( "Hello, closure!" );

看上面这段代码,如果用闭包的概念去看,我们很难能看出这是一个闭包。所以我们换一个角度去看,
函数(访问它们各自的词法作用域)当作第一级的值类型并到处传递。
这样是不是好理解一点
将一个内部函数(名为 timer)传递给 setTimeout(…)。timer 具有涵盖 wait(…) 作用域
的闭包,因此还保有对变量 message 的引用。
wait(…) 执行 1000 毫秒后,它的内部作用域并不会消失,timer 函数依然保有 wait(…)
作用域的闭包。
在我不知道的js中是这么说的
如果将函数(访问它们各自的词法作用域)当作第一级的值类型并到处传递,
你就会看到闭包在这些函数中的应用。在定时器、事件监听器、Ajax 请求、跨窗口通信、Web Workers 或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!
这上面让我们从另一个角度去看闭包,

讲的不清楚,希望大佬有指点指点我。

猜你喜欢

转载自blog.csdn.net/weixin_44655037/article/details/110952934