当SetTimeout遇到了字符串

本日闲来没事的时刻,去走走segementFault,看了看他人提的题目。说到setTimeout和window.onload争执。一开始我是挺迷惑他表他什么意思的,因为setTimeout和window.onload应当不会有显著的争执吧。带着迷惑去诘问。厥后贴出代码的时刻我就邃晓了,来看看他的代码中的迷惑吧。

window.onload=function(){
setTimeout("D.style.background='#990033'",2000);
}

他以为这个代码运转的时刻,setTimeout会报错,不能准确的运转指定的代码,就以为在window.onload和setTimeout有争执。

我对这个题目异常感兴趣。也本身试了一下,发明确切不能运转字符串内里的代码。然则照样很疑心window.onload和setTimeout怎么可能会有争执呢?

解决题目

为了测试轻易,我就轻微改动了一下代码。将setTimeout的挪用改成挪用函数。

window.onload = function() {
    function myFun(i) {
        alert(1);
    }
    setTimeout('myFun(1)', 2000);
}

在这里发明确实不能运转,然则这里的题目就很显著了,我将函数的挪用变成了 'myFun(1)' 字符串挪用,所以会涌现不能挪用 myFun() 的题目。

为了深切明白我们在W3school查询一下setTimeout的用法

《当SetTimeout遇到了字符串》

那末就是setTimeout只能接收函数或者是表达式的盘算。那末如今答案很显著了,既是setTimeout不支撑第一个参数为字符串的挪用。

然则根据发问者的用法,这类 "D.style.background='#990033'" CSS的挪用也必需准守这类情势那末怎么办?

那末就恪守setTimeout的划定规矩,说干就干,将他装换成函数就好了。见以下代码。

window.onload=function(){
setTimeout(function(){
    D.style.background='#990033'
},2000);
}

这里的2秒钟以后就会实行setTimeout内里的匿名函数,即准守了setTimeout的准绳,也能够应用setTimeout来挪用相似字符串的情势的功用代码。

回到发问而且深切发掘

回到提出的题目上来,深切的发掘,实在并非setTimeout和window.onload有争执,在本来的题目中,实际上是Javascript作用域在作祟。

在本来的题目中,假如是 setTimeout("D.style.background='#990033'",2000); 的话,因为setTimeout的第一个参数支撑的是函数或者是表达式,所以字符串会被自动实行 new Function ,将这个字符串强迫转换成一个函数。

我们晓得在Javascript中,函数内里有本身的作用域,和外界的作用域差别,而在函数内部并没有D.style.background这个对象,所以会有报错。在我变化的例子中,也是云云,假如使用了 setTimeout('myFun(1)', 2000),那末这内里的字符串就会被自动实行 new Function ,所以建立出来的函数不在这个作用域内,固然也就不能挪用,会涌现没法找到的题目了。

《当SetTimeout遇到了字符串》

    原文作者:chan_chun
    原文地址: https://segmentfault.com/a/1190000007363321
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞