search

Home  >  Q&A  >  body text

javascript - js函数中变量问题。

代码:

<body>

<p class="box" id="one">

<p class="hd">
    <span class="current">体育</span>
    <span>娱乐</span>
    <span>新闻</span>
    <span>综合</span>
</p>
<p class="bd">
    <ul>
        <li class="current">我是体育模块</li>
        <li>我是娱乐模块</li>
        <li>我是新闻模块</li>
        <li>我是综合模块</li>
    </ul>
</p>

</p>

<p class="box" id="two">

<p class="hd">
    <span class="current">体育</span>
    <span>娱乐</span>
    <span>新闻</span>
    <span>综合</span>
</p>
<p class="bd">
    <ul>
        <li class="current">我是体育模块</li>
        <li>我是娱乐模块</li>
        <li>我是新闻模块</li>
        <li>我是综合模块</li>
    </ul>
</p>

</p>

</body>
</html>
<script>

// 封装tab栏
function tab(id) {  
    // 获取元素,只获取这个id下面的span和li元素
    var eleId = document.getElementById(id);  // 获取id元素
    var spans = eleId.getElementsByTagName("span");  //4个span
    var lis = eleId.getElementsByTagName("li");      //4个li
    for(var i=0; i<spans.length;i++) {  // 遍历4个span
        spans[i].index = i;  //给每个span指定一个索引号
        spans[i].onmouseover = function() {  //鼠标经过span元素
            //先清除所有的spans和lis的样式
            for(var j = 0;j<spans.length; j++) {
                spans[j].className = "";  
                lis[j].className = "";  
            }
            this.className = "current";    //当前span改变样式
            lis[this.index].className = "current";  //当前那个li显示出来
        }
    }
}
tab("one");   // 实参
tab("two");   // 实参

问题:tab()函数调用两次,获取了不同id下的spans和lis元素,同时给每个span元素绑定了事件,当事件触发时,执行匿名函数,这个时候,在匿名函数中,它怎么知道spans和lis变量代表的是one元素中的,还是two元素中的呢? tab()函数执行完毕,spans和lis变量释放了吗?

PHP中文网PHP中文网2818 days ago307

reply all(1)I'll reply

  • 高洛峰

    高洛峰2017-04-10 17:27:24

    1. 这段代码达不到你想要的效果. lis设为空会导致事件函数中的lis为null, 详情请搜索"循环中产生的闭包".

    2. 一个函数一个作用域, 一般来说函数执行完毕后, 局部变量删除释放(此处产生闭包所以暂时不会), 又因为tab传进去的参数不同, 故tab执行两次时互不影响.

    reply
    0
  • Cancelreply