window.onload搭配seTimeout会报错这是为什么呢?

问题描述:

<script>
    window.onload = function() {
        setTimeout('haha()', 1000);

        function haha() {
            console.log('haha');
        }
    };
</script>

这样写会报错

img

但是去掉windows.onload就不会了

<script>
    setTimeout('haha()', 1000);

    function haha() {
        console.log('haha');
    }
</script>

这是为什么呢?

setTimeout参数是字符串时,需要是全局函数
可以这样

<script>
    window.onload = function() {
        setTimeout(haha, 1000);
 
        function haha() {
            console.log('haha');
        }
    };
</script>

也可以这样

<script>
    window.onload = function() {
        setTimeout('haha()', 1000);
        window.haha=function() {
            console.log('haha');
        }
    };
</script>
 

...function haha 写window.onload {}外面试试

setTimeout第一个参数如果是字符串类型,那么效果与Function(string)的效果类似,字符串内的代码的作用域为全局。如果在window.onload内调用那么haha函数的作用域将在window.onload的方法内,而不是全局,所以setTimeout拿不到haha函数。
解决方法:
setTimeout("haha")改为setTimeout(haha)

onload内部不能定义函数,需要在外面定义。


<script>
  function haha() {
    console.log('haha');
  }
  window.onload = function() {

    setTimeout('haha()', 1000);
  };
</script>