闭包级别局部变量存储DOM元素的风险

来源:互联网 发布:php读取图片并输出 编辑:程序博客网 时间:2024/04/28 14:59

在闭包中编写js有很多好处,最大的好处就是可以一直保存上下文,因此许多js插件都是在闭包中编写的。例如:

 var a = (function() {     var content = $("#content");     var dis = function() {         console.log(content);         content.css("background-color", "yellow");     };     return {         "dis": dis     }; })();

上述写法就是在闭包中封装了对于DOM元素的操作,在闭包一开始就把所有有可能涉及的DOM元素”#content”获取到并复制给闭包内的局部变量,当执行a.dis()时会在控制台输出该DOM元素并修改背景色为黄色。很好很规范的写法是不是?

但是在闭包中如果涉及到DOM元素的操作,并且该DOM元素在使用过程中有删除和重建的操作,上述的写法就会出问题,比如:页面上增加对于$(“#content”)[0]元素的删除和重建操作,a.dis()还能正确执行,修改div的背景色吗?

全部代码如下:

<html><head>    <title>DOM操作测试</title>    <meta charset="utf-8">    <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>    <script>    $(document).ready(function() {        var a = (function() {            var content = $("#content");            dis = function() {                console.log(content[0]);                content.css("background-color", "yellow");            };            return {                "dis": dis            };        })();        $("#btn2").click(function() {            $("#main").empty();        });        $("#btn3").click(function() {            $("#main").html('<div id="content" style="width:100px;height:100px;background:black"></div>');        });        $("#btn1").click(function() {            a.dis();        });    })    </script></head><body class="body">    <div id="main">        <div id="content" style="width:100px;height:100px;background:black"></div>    </div>    <input id="btn1" type="button" value="修改DOM" />    <input id="btn2" type="button" value="删除DOM" />    <input id="btn3" type="button" value="增加DOM" /></body></html>

测试过程:

  1. 点击“修改DOM”,DIV背景变为黄色
  2. 点击“删除DOM”,DIV被删除
  3. 点击“增加DOM”,DIV又被加上
  4. 再次点击“修改DOM”,DIV背景未变化,但是控制台中a.dis()仍然能输出先前记录下的DOM元素

结论:闭包内被预先定义的DOM元素变量无法在DOM元素变化时及时更新,其相当于只存储了该DOM对象当时的快照,当DOM元素变化(删除后重建)时无法正确的指向最新的DOM元素。

上述测试标明,在闭包中涉及的DOM元素的操作需要注意,DOM对象如果是在闭包内使用局部变量预先定义好,而不是每次使用时用jquery来获取,那就需要注意这个DOM元素变化可能带来的风险,否则会发生无法预知的错误。

建议不要使用闭包级别的局部变量来存储DOM对象,而是在闭包的方法内使用局部变量来存储DOM对象,这样可以避免该风险的发生。

修改后的闭包代码:

 var a = (function() {     dis = function() {         var content = $("#content");         console.log(content);         content.css("background-color", "yellow");     };     return {         "dis": dis     }; })();
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办 商家想入住美团没有营业执照怎么办 旅行团定好的人数临时加人该怎么办 淘宝上发货后12天未收到款怎么办 京东购买的东西烂了怎么办 苹果4s手机激活密码忘了怎么办 小米4c返回键失灵了怎么办 小米4c下面三个键失灵怎么办 谷歌浏览器打不开指定的网址怎么办 电脑上我的电脑图标没了怎么办 手机上的短信图标没了怎么办 qq密保手机被别人换了怎么办 苹果六手机很卡网络不给力怎么办 堡垒之夜卡在载入界面怎么办 登录新福建一直说网络不给力怎么办 开发游戏平台给了钱不给东西怎么办 代号英雄与服务器断开连接了怎么办