我不明白为什么下面的代码块在单击按钮时的工作方式不同。它们都包含两个警告不同消息的函数,不同之处在于第二个示例中有单独的< script>
块。
In第一个例子,两个按钮都警告 Hello too !!!
,但在第二个例子中,它们会提醒每个函数的各个消息。
第一个代码:



<!DOCTYPE html>
< html lang =“en”>
< head>
 < meta charset =“UTF-8”>
 <标题>名称< /标题>&#的xD;
< /头>&#的xD;
<主体>&#的xD;
 < button id =“red”> Hello!< / button>
 < button id =“green”> HelloTooo< / button>
 <脚本>&#的xD;
 function func(){
警报( '你好!');&#的xD;
 }&#的xD;
 document.getElementById(“red”)。onclick = func;

 function func(){
警报('你好!!!');
 }&#的xD;
 document.getElementById(“green”)。onclick = func;
 < /脚本>&#的xD;
< / BODY>&#的xD;
< / HTML> 代码>
&#的xD;
 第二个代码:

&# xA;
<!DOCTYPE html>
&# xA;< html lang =“en”>
< head>
 < meta charset =“UTF-8”>
 <标题>名称< /标题>&#的xD;
< /头>&#的xD;
<主体>&#的xD;
 < button id =“red”> Hello!< / button>
 < button id =“green”> HelloTooo< / button>
 <脚本>&#的xD;
 function func(){
警报( '你好!');&#的xD;
 }&#的xD;
 document.getElementById(“red”)。onclick = func;
 < /脚本>&#的xD;
 <脚本>&#的xD;
 function func(){
警报('你好!!!');
 }&#的xD;
 document.getElementById(“green”)。onclick = func;
 < /脚本>&#的xD;
< / BODY>&#的xD;
< / HTML> 代码>
&#的xD;&#XA; 为什么它在这两种<代码集时都以这种方式运行> func 是在全局范围内定义的吗?
&#xA;答案 0 :(得分:4)
那是因为函数声明被提升到封闭函数的顶部,或者在这种情况下是脚本。这允许您在声明之前调用函数
func();
function func() {
console.log('This works!');
}
然后,您的第一个示例变为类似
<script>
/* Function declarations are hoisted to the top */
function func() {
console.log('hello!');
}
function func() {
console.log('Hello too!!!');
}
/* func is the 2nd one for both calls */
func();
func();
</script>
但是,如果使用不同的脚本,则第一个脚本将在运行第二个脚本之前完全运行。所以第二个函数声明不会影响第一个。
<script>
/* Function declarations are hoisted to the top */
function func() {
console.log('hello!');
}
func();
</script>
<script>
/* Function declarations are hoisted to the top */
function func() {
console.log('Hello too!!!');
}
func();
</script>
请注意,如果您刚引用func
而不是存储其值,则会有所不同,因为第二个脚本将有效地更改全局func
变量。
<script>
/* Function declarations are hoisted to the top */
function func() {
console.log('hello!');
}
setTimeout(function(){
func(); /* By the time this is called, it will have been altered
by the 2nd script */
}, 1e3);
</script>
<script>
/* Function declarations are hoisted to the top */
function func() {
console.log('Hello too!!!');
}
setTimeout(function(){
func();
}, 1e3);
</script>