问题:当参数一为函数时,正常调用函数setInterval(fn(),1000)会使setInterval失效
setInterval的第一个参数为函数时,写函数名为对函数的调用;函数名加函数调用符()则是使函数直接执行。
setInterval(fn(),1000)就相当于第一个参数是fn函数执行完后return回来的返回值,
此时fn如果有返回值,参数一为return后的代码,若没有返回值为undefined
所以setInterval会失效
解决方案:
① setInterval(fn,1000)
② setInterval(function(){
fn()
},1000)
③ setInterval("fn(arr)",1000)
""如同eval()方法
缺点:当参数arr不是全局变量时会报错
当setInterval与fn在全局作用域时无报错
<script>
function fn(val){
console.log(val);//hello
}
setInterval("fn('hello')",1000);
</script>
当setInterval与fn不在全局作用域时,因为fn()是以字符串方式传递的,它的作用域是全局作用域,此时全局作用域是无法访问到fn()
<script>
//闭包:
function outerFn() {
function fn(val) {
console.log(val)
}
setInterval("fn('hello')",1000)
}
</script>
会报错:Uncaught ReferenceError: fn is not defined
解决方法:
<script>
function outerFn(val) {
return function(){
console.log(val);
}
}
setInterval(outerFn('hello'),1000)
</script>
④ setInterval(fn(arr),1000);
function fn(arr) {
return function() {
......
}
}
⑤ 重新定义setInterval()
var my_setInterval = setInterval;
window.setInterval = function(callback,timeout,param){
var args = Array.prototype.slice.call(arguments,2);
var _callback = function(){
callback.apply(null,args);
}
my_setInterval(_callback,timeout);
}
window.setInterval(hello,3000,userName)
⑥ ES5新增setInterval(code,millisec,param)
setInterval(fn,1000,num);
function fn(num){
console.log(num)
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律