问题:当参数一为函数时,正常调用函数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)
}

posted on   TANTT  阅读(335)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律



点击右上角即可分享
微信分享提示