JavaScript:函数应用的几个细节问题
一、以函数调用的形式进行赋值操作的情况
比如:
ele.onclick = HTML();
先看一下具体的代码情况,如下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>W3Cschool教程(w3cschool.cn)</title>
</head>
<body>
<h1 id='h1'>1</h1>
<h1 id='h2'>2</h1>
<h1 id='h3'>3</h1>
<script>
function csHTML(ele) {
console.log(ele.innerHTML);
}
function HTML() {
// console.log(this.innerHTML);
console.log('123');
}
var h1coll = document.getElementsByTagName('h1');
for (var i = 0; i < h1coll.length; i++) {
var ele = h1coll[i];
//一个错误的示范 这样叫方法调用HTML()
ele.onclick = HTML();
// ele.onclick = function() {
// console.log(this.innerHTML);
// }
}
</script>
</body>
</html>
运行结果如下:

核心错误:ele.onclick = HTML()
这是这段代码最关键的错误。
HTML()是函数调用,代码执行到这一行时会立刻执行HTML()函数,并把函数的返回值(这里是undefined)赋值给ele.onclick。- 这意味着:页面加载时就会打印 3 次
123,而点击<h1>元素时不会有任何反应(因为onclick被赋值成了undefined)。 - 正确的事件绑定方式是:ele.onclick = HTML;
-
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>W3Cschool教程(w3cschool.cn)</title> </head> <body> <h1 id='h1'>1</h1> <h1 id='h2'>2</h1> <h1 id='h3'>3</h1> <script> function csHTML(ele) { console.log(ele.innerHTML); } function HTML() { console.log(this.innerHTML); // console.log('123'); } var h1coll = document.getElementsByTagName('h1'); for (var i = 0; i < h1coll.length; i++) { var ele = h1coll[i]; //这才是正确的方式 ele.onclick = HTML; // ele.onclick = function() { // console.log(this.innerHTML); // } } </script> </body> </html>
运行结果如下:

鼠标点击左侧对应的1-2-3数字,右侧的控制台就会输出相应的点击对象的值;
- 函数引用 vs 函数调用:
ele.onclick = HTML:把HTML函数本身赋值给onclick事件,点击元素时才会执行这个函数(这是事件绑定的正确方式)。ele.onclick = HTML():立刻执行HTML()函数,把返回值(undefined)赋值给onclick,点击元素无反应。
- this 的指向:在事件处理函数中,
this默认指向触发事件的 DOM 元素(这里就是被点击的<h1>),所以this.innerHTML能拿到<h1>里的内容(1/2/3)。
二、匿名函数进行赋值的情况
继续将上述代码稍微改造一下,如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>W3Cschool教程(w3cschool.cn)</title>
</head>
<body>
<h1 id='h1'>1</h1>
<h1 id='h2'>2</h1>
<h1 id='h3'>3</h1>
<script>
function csHTML(ele) {
console.log(ele.innerHTML);
}
function HTML() {
console.log(this.innerHTML);
// console.log('123');
}
var h1coll = document.getElementsByTagName('h1');
for (var i = 0; i < h1coll.length; i++) {
var ele = h1coll[i];
//这才是正确的方式
// ele.onclick = HTML;
ele.onclick = function() {
console.log(123456);
}
}
</script>
</body>
</html>
运行结果如下:

点击左侧数字,右侧控制台就会输出123456,多次点击就会计数,如上所示,共点击了四次;

浙公网安备 33010602011771号