问答详情
源自:3-5 显示和隐藏(display属性)

全局变量与局部变量问题,萌新提问~

匿名函数不能直接应用全局变量吗?我这样写就不执行了?

        var mychar = document.getElementById("con");
        function hidetext(){
            //var mychar = document.getElementById("con");
            mychar.style.display="none";
        }  
        function showtext(){  
            //var mychar = document.getElementById("con");
            mychar.style.display="block";
        }


提问者:Kotler 2017-03-13 20:23

个回答

  • 我不是管家
    2017-04-18 07:46:10

    上面那位同学已经讲到点子上了,你的代码毫无疑问是没有错的,但是为什么不行的,因为如果你在函数外面获取这个 mychar变量是获取不到的,浏览器解析你的页面代码是从上到下的,当看到函数外的你的全局变量的时候,dom并没有开始加载,这时候他会疑问:'你是谁?'所以变量mychar的至为null;

    而在函数里面可以执行是因为当你点击的时候dom已经加载完毕,他可以正常的开心获取到元素节点‘哦,我的id是text啊’

  • Gemma_Tong
    2017-03-23 22:33:37

    读了后面那节课我意识到我上面这个回答错误了,原来和PHP的不一样。

    在js里面,函数体外的声明的是全局变量,函数内也是可以使用的。

    那为什么在这里你用了没效果?是因为,浏览器是一行一行渲染HTML页面的,读到 var mychar = document.getElementById("con"); 这一句的时候,它还没读到下面的body部分,所以压根不知道con是什么东西,所以返回的是个NULL。

    那在这样的情况下,用户点击按钮,触发事件调用了函数之后,函数里面的 mychar 是个NULL,所以就没有效果了。

    所以一般都会把js代码放在底部,比如你试试把整个 <script></script>的代码放到</form> 后面,再点按钮就会发现有效了。

  • Gemma_Tong
    2017-03-23 21:57:47

    函数是一个独立的玩意,它只认识传进来的参数,不认识其他变量什么的。

    除非你在函数体里面定义变量为全局变量,就可以引用函数体外的变量的值了。

  • 慕容9134147
    2017-03-16 00:39:49

    你想想,如果当你调用hidetext()函数的时候,会执行hidetext()函数上面的语句吗???????

  • OneMagic
    2017-03-15 20:58:24

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>显示隐藏内容</title>
    </head>
    <body>
    <p id="text">我是刘芫</p>
    <script type="text/javascript">
    var mychar = document.getElementById("text");
    
    function show() {
    mychar.style.display = "none";
    }
    
    function hidd() {
    mychar.style.display = "block";
    }
    </script>
    <input type="button" name="button"  value="显示内容" onclick="show()" />
    <input type="button" name="button"  value="隐藏内容" onclick="hidd()" />
    </body>
    </html>

    因为跟页面加载顺序有关 。先加载<p>标签里的内容,再抓取就只要一次

  • vivian_菱
    2017-03-13 21:42:38

    http://www.imooc.com/qadetail/199016

  • 慕粉1859536052
    2017-03-13 21:15:09

    你注释掉了...