zoukankan      html  css  js  c++  java
  • 闭包常见问题及解决方案

    闭包常见的问题就是在无形之中几个闭包共享同样的变量,导致结果与预期不符。
    HTML代码:

    <!Doctype html>
    <html>
    <head>
        <meta charset=utf-8 />
        <title>closure test</title>
        <style>
        .hidden{
            display: none;
        }
        .visible{
            display: block;
        }
        </style>    
        
    </head>
    <body>
        <ul id="menu">
            <li>
                <h3>文章管理</h3>
                <dl class="hidden">
                    <a href="#"><dd>添加文章</dd></a>
                    <a href="#"><dd>文章列表</dd></a>
                </dl>
            </li>
    
            <li>
                <h3>教师管理</h3>
                <dl class="hidden">
                    <a href="#"><dd>添加教师</dd></a>
                    <a href="#"><dd>教师列表</dd></a>
                </dl>
            </li>
    
        </ul>
    
    </body>
    </html>

    当使用以下js代码添加事件时发现与预期结果(点击标题时不显示隐藏的内容)不符:

    <script type="text/javascript">
    window.onload=function(){
    var menu = document.getElementById("menu");
    var element = menu.getElementsByTagName("h3");
    for(var i=0;i<element.length;i++){
        element[i].onclick=function(){
            var dl=element[temp].parentNode.childNodes[3];
        if (dl.className == "hidden") {
                    dl.className = "visible";
                } 
        else if (dl.className == "visible") {
        dl.className = "hidden";
        } 
    
        }
    
     }
    
    }

    遇到这类问题的解决方案为:
    (1)使用this
    (2)使用匿名函数

    (3)使用函数调用

    1. 使用this

         

    <script type="text/javascript">
        window.onload = function() {
            var menu = document.getElementById("menu");
            var element = menu.getElementsByTagName("h3");
            
            for (var i = 0; i < element.length; i++) {
                element[i].onclick=function(){
                    var dl=this.parentNode.childNodes[3];
                    if (dl.className == "hidden") {
                        dl.className = "visible";
                    } else if (dl.className == "visible") {
                    dl.className = "hidden";
                    }
    
                }
            }
            
        }
    </script>

        2.使用匿名函数

    </style>    
        <script type="text/javascript">
        window.onload = function() {
            var menu = document.getElementById("menu");
            var element = menu.getElementsByTagName("h3");
            for (var i = 0; i < element.length; i++) {
                (function(){    
                    var temp=i;
                    var dl=element[temp].parentNode.childNodes[3];
                    element[temp].onclick = function() {
                        
                        if (dl.className == "hidden") {
                            dl.className = "visible";
                        } else if (dl.className == "visible") {
                            dl.className = "hidden";
                        }
                    }
    
                })()
            }
    
        }

          3.使用函数调用

    <script type="text/javascript">
        window.onload = function() {
            var menu = document.getElementById("menu");
            var element = menu.getElementsByTagName("h3");
            
            for (var i = 0; i < element.length; i++) {
                var dl=element[i].parentNode.childNodes[3];
                Add(element[i],dl);
            }
            function Add(elem,dl){
                elem.onclick=function(){
                    if (dl.className == "hidden") {
                            dl.className = "visible";
                        } 
                        else if (dl.className == "visible") {
                            dl.className = "hidden";
                        }
                }
    
            }
    
        }

    总的来说,解决闭包问题的核心是保存要使用的值,避免发生变量的共享。

  • 相关阅读:
    long和Long的区别
    C语言的变量的内存分配
    Java蓝桥杯 算法提高 九宫格
    Java实现 蓝桥杯算法提高金明的预算方案
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
  • 原文地址:https://www.cnblogs.com/zsblogs/p/4928256.html
Copyright © 2011-2022 走看看