关于onclick事件

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>layer js</title>
</head>

<body>
    <div>
        <div>
            <img src="static/images/bg.png" alt="">
            <input type="button"onclick="mm()" id="btn" />
        </div>
        <div></div>
    </div>
</body>
    <script type="text/javascript">
        window.onload=function(){
             var btn=document.getElementById("btn");
             function mm()
           {
               
                var sHeight=document.documentElement.scrollHeight;
                var sWidth=document.documentElement.scrollWidth;
                var mask=document.createElement("div");
                mask.id="omask";
                mask.style.height=sHeight+"px";
                mask.style.width=sWidth+"px";
                document.body.appendChild(mask);
                var oimg=document.createElement("div");
                oimg.id="img";
                oimg.innerHTML="<img src='static/images/bg.png' alt='' />";
                document.body.appendChild(oimg)
                alert("sssss")
            
}
        }
    </script>
</html>


为什么我把mm函数写在window.onload里,点击按钮会报错。说mm()没定义呢,去掉window.onload就好了

Dream0703
浏览 1322回答 1
1回答

stone310

这是一个典型的作用域问题,window.onload=function(){}这就是一个外部函数(函数作用域),那它里面的变量、函数,超出这个作用域就无效了,是不能被外面直接调用的,解决办法1、封装函数(就是你说的把window.onload去掉,所有定义的变量全部放在mm函数里面)2、写一个闭包(就是写成 return function mm(){},然后外部调用window.onload()(),两个括号),非常不推荐,写的丑乱难看,而且复杂可以先去了解一下JS的作用域(这个比较简单而且很重要),再看是否有兴趣去了解闭包(个人觉得理解了作用域,闭包也不需要刻意去学)
打开App,查看更多内容
随时随地看视频慕课网APP