业界 作者:SegmentFault 2022-12-05 19:00:42 阅读:850
什么是闭包
闭包的特性
闭包的优缺点
闭包的作用
闭包的注意点
var a = '闭包';
function getValue(){
var a = '函数局部作用域'
console.log(a)
}
getValue() //函数局部作用域
function getData() {
var str = "闭包练习";
var fun = function(){
var innerStr = '内部变量'
}
console.log(innerStr)
//innerStr is not defined 函数外层是访问不到 函数内层变量的
}
getData()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<script>
var nodes = document.getElementsByTagName('div')
for (var i = 0; i < nodes.length; i++) {
nodes[i].onclick = function () {
alert(i)
}
}
</script>
</body>
</html>
# 闭包解决办法
<script>
var nodes = document.getElementsByTagName('div')
for (var i = 0; i < nodes.length; i++) {
(function(i) {
nodes[i].onclick = function () {
alert(i)
}
})(i)
}
</script>
var num = 1;
function getValue(){
var num = 0;
return function(){
num++
console.log(num)
}
}
var s = getValue()
s()
s()
// 1 2
var num = 1;
function getValue(){
var num = 0;
return function(){
num++
console.log(num)
}
}
getValue()()
getValue()()
// 0 0
function f2(){
let num = 0;
addNum = function(){
num++
}
function f3(){
console.log(num)
}
return f3
}
var a = f2()
a()
addNum()
a()
// 0 1
结果为 0 1
第一次 执行 a() 时, 结果为 0 , 很好理解。
第二次 执行的 f2() 函数内部的 addNum 函数,发现没这个匿名函数赋值给一个变量,而且这个变量没加 var / let , 那么它此时的作用域为 全局 ,保存在内存当中。执行 addNum 时它访问的 f2() 函数内部的局部变量 num , 此时, addNum 的存在依赖于 f2,因此 f2 也在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
第三此 执行 a() 时, 因为 num 已存在内存中,而至值为1


基于 NPM 生态系统的供应链攻击正在变得越来越频繁、越来越严重,最新出现的供应链攻击涉及至少 18 个流行的代码包,这些代码包每周的下载次数超过 20 亿次。攻击源头是开发者 & 维护者 J
Strapi 是一个开源且高度可定制的 CMS。传统建网站,内容和页面样式绑得死死的,改起来很麻烦。Strapi 不一样!它只管存储和管理你的文字、图片、视频等内容本身,不限制你怎么把它们显示出来。你
谷歌刚刚为 Chrome 浏览器推出紧急安全更新用于修复 JavaScript v8 引擎中的高危安全漏洞,该漏洞编号 CVE-2025-6554,属于 v8 引擎中的类型混淆漏洞。目前已经有黑客利用