setTimeout关于函数名做参数的问题
前几天在调bug时发现一个诡异的问题。
function test(){ alert('4 seconds!'); } setTimeout(test(),4000);
这段代码立即执行,当时看不出问题的原因。只好先换了一种写法,如下。
function test(){ alert('4 seconds!'); } setTimeout('test()',4000);
这几天有空了,把这个问题的原因总结了一下:
在js中,函数只要是要调用它进行执行的,都必须加括号。此时,函数()实际上等于函数的返回值。就是说,只要加括号的,就代表将会执行函数体代码。不加括号的,都是把函数名称作为函数的指针,用于传参,此时不是得到函数的结果,因为不会运行函数体代码。它只是传递了函数体所在的地址位置,在需要的时候好找到函数体去执行。
所以,
function move(){} <=> move = function(){}
也就是说 move是个变量,存储的是函数本身,你把函数本身传给setInterval。但是因为没有返回值,那setInterval每4000毫秒执行一次“空”,所以啥都没干。
总之:当事件发生时要执行这个函数,那么只需要写函数名
this.onclick = ch ;
如果要执行函数,那么需要加括号
ch();