我正在 mozilla.org上研究 Javascript 中的闭包。有一个部分叫做常见错误,这让我大吃一惊。我不知道它到底在说什么。
代码如下,
<p id="help">Helpful notes will appear here</p>
<p>E-mail: <input type="text" id="email" name="email"></p>
<p>Name: <input type="text" id="name" name="name"></p>
<p>Age: <input type="text" id="age" name="age"></p>
function showHelp(help) {
document.getElementById('help').innerHTML = help;
}
function setupHelp() {
var helpText = [
{'id': 'email', 'help': 'Your e-mail address'},
{'id': 'name', 'help': 'Your full name'},
{'id': 'age', 'help': 'Your age (you must be over 16)'}
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = function() {
showHelp(item.help);
}
}
}
setupHelp();
文本出现在帮助中
只会显示最后一个帮助“你的年龄(你必须超过 16 岁)”,解决方案是在 setupHelp 之外重写 showHelp 函数
function makeHelpCallback(help) {
return function() {
showHelp(help);
};
}
function setupHelp() {
var helpText = [
{'id': 'email', 'help': 'Your e-mail address'},
{'id': 'name', 'help': 'Your full name'},
{'id': 'age', 'help': 'Your age (you must be over 16)'}
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
}
}
setupHelp();
我不明白它解决问题的机制。由于我从不使用javascript访问DOM,而是使用jQuery,所以我重写了jQuery中的函数
function makeHelpCallback(i) {
return function () {
$("#help").text(i);
};
}
(function () {
var helpText = [
{ 'id': 'email', 'help': 'Your e-mail address' },
{ 'id': 'name', 'help': 'Your full name' },
{ 'id': 'age', 'help': 'Your age (you must be over 16)' }
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
$("#"+item.id).focus(function () {
new makeHelpCallback(item.help)();
});
}
})();
但是错误并没有消失。据我所知,jQuery 没有 onfocus 处理程序,不可能将处理程序绑定到同一级别的侦听器。它必须在 function(){} 下。而且我无法达到与 Javascript 相同的效果。
那么无论如何要编写与Javascript代码等效的代码吗?
正如解释所说,它不起作用,因为听众共享相同的环境。不管是什么意思,onfocus = function(){showHelp(item.help)} 分别执行了三次。他们应该受到相应的约束。为什么他们会出现相同的情况?因为 showHelp 是一个静态对象?如果是这样,添加一个新的修饰符应该可以完成工作。并且 makeHelpCallback(item.help) 也共享相同的环境。但它有效。为什么为什么为什么???
为了您的测试方便,附上完整的 HTML 代码。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<p id="help">Helpful notes will appear here</p>
<p>E-mail:
<input type="text" id="email" name="email"></p>
<p>Name:
<input type="text" id="name" name="name"></p>
<p>Age:
<input type="text" id="age" name="age"></p>
<script src="Scripts/jquery-1.9.1.min.js"></script>
<script>
function makeHelpCallback(i) {
return function () {
$("#help").text(i);
};
}
(function () {
var helpText = [
{ 'id': 'email', 'help': 'Your e-mail address' },
{ 'id': 'name', 'help': 'Your full name' },
{ 'id': 'age', 'help': 'Your age (you must be over 16)' }
];
for (var i = 0; i < helpText.length; i++) {
var item = helpText[i];
$("#" + item.id).focus(function () {
makeHelpCallback(item.help)();
});
}
})();
</script>
</body>
</html>