最近在写代码的时候遇到了一个问题(关于是不是需要在被调用的函数名后加括号),总结一下大概是这个样子:
在实际运行的过程中可以发现几种不同的现象:
test1: 在刷新页面的瞬间立即执行
test2: 点击test2的按钮执行
test3: 点击test3的按钮执行
test4: 点击test4按钮不执行弹框操作
这是为什么呢?
1. 首先 test1 和 test2 都是 DOM2 级事件,他们的区别是,是否在函数名后面加();
函数名后面加括号表示立即执行,因此test1在刷新页面后立即执行弹框操作;
函数名后面不加括号则会等待事件触发时执行;
2. test3 和 test4 都是属于 DOM0 级事件调用的方式;
test3 可以执行弹框操作,test4 不执行,
因为这种函数事件写在标签属性中(DOM0 级写法),它的本质是会被当做字符串,当点击事件触发的时候,这段字符串会执行eval解析,点击一次, eval解析一次。因此,如果不在函数名后面带括号(),点击按钮,执行eval解析的时候无法做到立即执行;
假如我们在事件绑定的地方用js语句替代函数名也是可以做到立即执行,因为当点击按钮时,eval执行的就是一段可以弹框的js语句而不是需要调用的函数名
EG: <button οnclick="for(var a=0;a<10;a++)alert(a)">alert 0 to 9</button>
3. 因此关于DOM0级与DOM2级如何做到点击按钮,调用事件:
DOM0 级写法,需要在被调用的函数名后加括号
DOM2 级写法,不需要在函数名后加括号