在另一个函数的 if 中调用匿名函数
Calling an anonymous function within if of another function
如果基本表单的用户名未填写,我正在尝试 "insert" 警报器,我一直无助地试图理解为什么提交函数中的匿名函数没有被调用。
我的 html 之上的 JIC 我有一个准备好的警报块:
<div id="alerter">
</div>
有问题的函数:
<script>
function validateForm() {
var x = document.forms["formz"]["username"].value;
if (x == "") {
(function() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert');
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
})
return false;
}
}
</script>
<script id="alertonempty" type="text/html">
<strong>SMTH went wrong</strong> Seriously wrong
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</script>
是的,有一个调用 validateForm
的表格。
它确实采用用户名变量并可以使用它(也通过警报检查它)但是匿名函数不会被调用。
请帮我理解
您创建的是一个auto-executing anonymous function
,为了使该功能正常工作,您需要在末尾添加第二对括号:
function validateForm() {
var x = document.forms["formz"]["username"].value;
if (x == "") {
(function() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert')
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
})();
//-----^^^^
return false;
}
}
在 JavaScript 中,函数声明是 "hoisted"(请参阅此处:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting),因此在 "if" 块中声明函数的位置并不重要或者在 validateForm
函数的顶部 - 顺便说一句,这是做事的正确方法 "JavaScript way".
在你的例子中,你声明了匿名函数但从未真正调用过它。您的表达式被评估为一个新的匿名函数,该函数被愉快地提升并且永远不会被使用。以下是您应该做的:
function validateForm() {
function showAlert() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert')
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
}
var x = document.forms["formz"]["username"].value;
if (!x) {
showAlert();
return false;
}
}
或者,您可以将函数声明转换为 IIFE(即使在这种特殊情况下这是一种非常糟糕的形式):
(function(){....})();
如果基本表单的用户名未填写,我正在尝试 "insert" 警报器,我一直无助地试图理解为什么提交函数中的匿名函数没有被调用。
我的 html 之上的 JIC 我有一个准备好的警报块:
<div id="alerter">
</div>
有问题的函数:
<script>
function validateForm() {
var x = document.forms["formz"]["username"].value;
if (x == "") {
(function() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert');
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
})
return false;
}
}
</script>
<script id="alertonempty" type="text/html">
<strong>SMTH went wrong</strong> Seriously wrong
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</script>
是的,有一个调用 validateForm
的表格。
它确实采用用户名变量并可以使用它(也通过警报检查它)但是匿名函数不会被调用。
请帮我理解
您创建的是一个auto-executing anonymous function
,为了使该功能正常工作,您需要在末尾添加第二对括号:
function validateForm() {
var x = document.forms["formz"]["username"].value;
if (x == "") {
(function() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert')
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
})();
//-----^^^^
return false;
}
}
在 JavaScript 中,函数声明是 "hoisted"(请参阅此处:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting),因此在 "if" 块中声明函数的位置并不重要或者在 validateForm
函数的顶部 - 顺便说一句,这是做事的正确方法 "JavaScript way".
在你的例子中,你声明了匿名函数但从未真正调用过它。您的表达式被评估为一个新的匿名函数,该函数被愉快地提升并且永远不会被使用。以下是您应该做的:
function validateForm() {
function showAlert() {
alert("whoa");
var div = document.createElement('div');
div.setAttribute('class', 'alert alert-primary alert-dismissible fade show');
div.setAttribute('role', 'alert')
div.innerHTML = document.getElementById('alertonempty').innerHTML;
document.getElementById('alerter').appendChild(div);
}
var x = document.forms["formz"]["username"].value;
if (!x) {
showAlert();
return false;
}
}
或者,您可以将函数声明转换为 IIFE(即使在这种特殊情况下这是一种非常糟糕的形式):
(function(){....})();