在javascript中的window.onload中单击onclick

时间:2015-09-02 16:30:53

标签: javascript

考虑一下代码段:

    <head>      
        <script>
            window.onload = function(){
                function callMe(){
                    alert("Inside the function");
                    this.value = "New Value";                   
                }
                document.getElementById("thisCall").onclick = callMe;
            }
        </script>       
    </head>
    <body>          
        <input type="submit" id="thisCall" />   
    </body>

以上工作正常,按钮文本从提交更改为新值。

但是,如果我稍作修改,为什么下面的代码段不起作用?

        <script>
            window.onload = function(){
                function callMe(){
                    alert("Inside the function");
                    this.value = "New Value";                   
                }
                //document.getElementById("thisCall").onclick = callMe;
            }
        </script>

    </head>
    <body>          
        <input type="submit" id="thisCall" onclick="callMe();"/>        
    </body>

我不明白为什么

  

未捕获的ReferenceError:未定义callMe

是控制台的o / p?

3 个答案:

答案 0 :(得分:4)

函数声明创建一个指向当前范围中的函数的变量。

在JavaScript中,每个函数都会创建一个新范围。

您正在为callMe指定的匿名函数范围内创建onload。它不是一个全球性的。

onclick事件处理程序不在上述匿名函数的范围内,因此无法访问该变量。

答案 1 :(得分:3)

您的问题是callMe()函数声明位于onload作用域内,因此它是本地的,并且只在此作用域内可见。

你必须将它放在外面,这样它才能成为一个全局功能,可以在外面看到并可以从外面访问:

function callMe(){
     alert("Inside the function");
     this.value = "New Value";                   
}


window.onload = function(){
      callMe();  
      document.getElementById("thisCall").onclick = callMe;
}

修改

这段代码:

document.getElementById("thisCall").onclick = callMe;

正在工作,因为它是在onload函数范围内编写的,其中定义了函数callMe

如果您将onclick属性与callMe()属性一起使用,它将无效,因为正如全球范围内所述callMe is not defined并未得到认可,这就是您获得该等属性的原因所在var app = express(); var router = express.Router(); router.get('/', function(req, res) { res.send('unprotected route'); }); // best auth ever router.use(function(req, res, next) { if(req.body.token) { return next(); } res.send('auth failed'); }); router.get('/protected', function(req, res) { res.send('protected route'); }); /// catch 404 router.use(function(req, res) { res.sendStatus(404); }); app.use('/', router); 那里。

答案 2 :(得分:2)

这是由于范围。您的函数仅存在于分配给window.onload方法的匿名函数的范围内。该匿名方法知道该方法,因为它在其范围内定义并且可以调用它,但该范围之外的任何内容都不能。

这有意义吗?