闭包

tech2022-08-22  134

要了解闭包,先得了解变量的作用域,分为全局作用域和局部作用域,JS中函数内部可以访问函数外部的变量,但函数外部却无法访问函数内部的变量。 闭包就是能够访问其他函数内部的变量的函数,闭包的本质就是把函数内部和外部连接起来。 闭包有一个封闭性的特点:就是一旦形成闭包,那么外界就无法访问到闭包里面的数据 闭包=函数+词法作用域 词法作用域:即以变量声明定义的位置为参照,如果当前位置没有定义,就会访问父级定义的位置

function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 function displayName() { // displayName() 是内部函数,一个闭包 alert(name); // 使用了父函数中声明的变量 } displayName(); } init();

平时工作中用到的闭包狭义上闭包: 1.函数内嵌套函数 2.子函数引用了父函数的相关变量

特点:长期驻留内存

闭包的应用场景及实现 1.求和

//求和 function makeAdd(x) { return function(y) { return x+y } }

2.设置字号

//设置字号 function setFontSize(size) { return function() { document.body.style.fontSize=size+"px" } }

3.循环表单

function makeHelp(help) { return function() { console.log(help) document.querySelector('.help').innerHTML=help } } function init() { var userInfo=[ {id:'username',helpText:'请输入用户名'}, {id:'email',helpText:'请输入邮箱'}, {id:'address',helpText:'请输入地址'}, ] //动态绑定onfocus事件 for(var i=0;i<userInfo.length;i++) { var item=userInfo[i]; document.getElementById(item.id).onfocus=makeHelp(item.helpText) } } init()

4.封装组件或插件

//封装组件或插件 var Counter=(function() { //私有变量 var index=0; //私有方法 var add=function() { return index++; } var jian=function() { } return { //暴露出去供用户的方法 increment:function() { add() }, getValue:function() { return index; } } })()

闭包的优缺点

优点:可以模仿块级作用域,把变量保存在内存中,防止全局变量污染,就是减少创建全局变量,减少传递给函数的参数量; 缺点:虽然说防止了全局变量污染,但是这样容易导致内存泄漏,会让使用过的变量无法回收,一直占着内存

最新回复(0)