考虑一下代码段:
<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?
答案 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方法的匿名函数的范围内。该匿名方法知道该方法,因为它在其范围内定义并且可以调用它,但该范围之外的任何内容都不能。
这有意义吗?