关于JavaScript中回调函数疑问?
像对于setInterval()函数中第一个函数参数,我有点疑问。我知道它可以传一个匿名函数如:setTimeout(function(){alert("test")},...
像对于setInterval()函数中第一个函数参数,我有点疑问。
我知道它可以传一个匿名函数如:setTimeout(function(){alert("test")},10);
也可以先定义好一个test函数再写成这样setInterval("test()",10)。
但是匿名函数不是等于函数名吗?只有后面跟()才算执行吗?那第二种写法按理说不应该是setInterval(test,10) ,写成setInterval("test()",10)不是相当于传了一个函数执行结果而不是函数名。为什么呢? 展开
我知道它可以传一个匿名函数如:setTimeout(function(){alert("test")},10);
也可以先定义好一个test函数再写成这样setInterval("test()",10)。
但是匿名函数不是等于函数名吗?只有后面跟()才算执行吗?那第二种写法按理说不应该是setInterval(test,10) ,写成setInterval("test()",10)不是相当于传了一个函数执行结果而不是函数名。为什么呢? 展开
3个回答
展开全部
function a(a1, b1){
console.log(a1, b1);
}
setTimeout(a, 3000, 'y', 'n')
首先,在控制台里,如果我输入 a,我只会得到一个代码内容的回调,如果我输入 a() 我就可以执行这个函数。而输入 'a()' 得到的是一个字符串 'a()'。
而 setTimeout 为了执行一个 'alert("计时器")' 这个字符串,就会像 eval 强制转换成可执行代码。
setInterval("test()",10)不是相当于传了一个函数执行结果而不是函数名
所以这句话话的理解是不正确的,你只是在执行一个字符串,他被强制转换成代码而已
追问
恩,你说eval我就大概明白了,那setInterval(test,10)这样写其实也是对的是吧。
类似的,在行内标签中使用btn绑定事件使用"Submit()"字符串,和先使用js找到它再绑定函数名$('button').onclick=Submit,和上面的例子是类似原理,对吗?
追答
其实 eval 的解释并不精确,只是为了便于理解这个执行的行为
实际上计时器执行字符串代码的时候,也是会包装成一个函数才去执行
onclick 属性的操作原理大径相同,onclick 属性也会把属性值传递到 click 事件上,形成一个 onclick 使用的函数体
setInterval(test,10) 才是标准的调用函数写法,这样不用再进行包装了,传参也更方便,如果需要给test 传参,就在时间后面追加
setInterval(test,10, 'arg1', 'arg2')
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询