setInterval第一個參數加引號與不加引號區別

在JavaScript中的setInterval() 方法可按照指定的週期(以毫秒計)來調用函數或計算表達式。setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用做 clearInterval() 方法的參數來將其中止。javascript

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
      function fun() {
            alert(1);
        }
        setInterval("fun()",1000);//全局做用域下正常執行
        setInterval(fun(),1000); //調用函數正常,setInterval調用出錯
        setInterval(fun,1000);  //正確
    </script>
</head>
<body>
 
</body>
</html>

以上代碼來講都會彈出結果1.
固然以上代碼其執行環境爲全局。setInterval 第一個參數 能夠是函數名、匿名函數、函數的引用以及其餘可執行代碼。html

setInterval("fun()",1000);

其中這種加引號的調用就能夠理解爲 可執行代碼  就行eval 同樣去執行第一個參數,就是對fun方法的調用 理所固然的彈出 1  一秒鐘間隔,一直執行.java

setInterval(fun(),1000);

而這個調用我就不理解使用者經過這種方式使用setInterval 的意圖爲什麼.
fun() 是對函數的直接調用,也就是說當setInterval尚未開始函數func就執行了。若是這個函數沒有返回值或者返回值不是可執行的函數或者其餘的代碼的話,就以上代碼而言只是彈出1,以後就遍報錯了.
難道這樣的調用真的不能夠嗎?實際上是能夠的!例如代碼:函數

      function funone() {
          return function () {
            alert("qishiwoyenengzhixing")
          }
      }
setInterval(funone(), 1000);//你敢說我不能執行?

我我的認爲這種設計或者調用徹底沒有任何意義,用其餘的方法就好了。測試

setInterval(fun,1000); //這種方法是正確的。

你們能夠把這種調用setInterval的第一個參數看做參數爲 函數名或函數的引用。固然咱們還能夠這樣調用,使用匿名函數。spa

setInterval(function () {
 
            alert("我一秒中執行一次");
        }, 1000)

有些人可能發現,在全局做用域下  setInterval("fun()",1000); 能夠正常執行,但放到window.onload函數中卻不能執行。爲何呢?
先請看代碼:設計

window.onload = function () {
            function fun() {
                alert(1);
            }
             setInterval("fun()",1000);//這個報錯了 未定義   重點在這一個
            // setInterval(fun(), 3000); //這個和剛纔全局的表現同樣
           // setInterval(fun,1000);//這個沒有問題
 
        }

setInterval("fun()",1000); 這種調用報未定義,在全局咱們已經說過了 。咱們能夠把帶引號的參數理解爲 可執行代碼 。
而setInterval如今把以引號包括的可執行代碼進行處理。就像eval同樣給予執行。其在執行中 fun() 執行環境發生了變化,不是在window.onload方法下,而是在全局環境中也就是window.你們應該知道JavaScript存在做用域鏈,由內向外依次查找。內部能夠訪問其上層的函數和變量,而外部卻不能訪問內部的函數和變量。JavaScript有一個預編譯處理,首先對函數和變量進行預編譯。也就是說其函數和變量做用域是在其聲明的時候肯定的,而不是在執行的時候肯定。當setInterval把"fun()"執行環境換爲全局的後,對fun的調用是無效的。由於全局不能訪問局部的函數和變量。window.onload相對於window來講就是局部的。

對與setInterval(fun(), 3000)和setInterval(fun,1000)調用其執行環境並無改變,因此是能夠訪問的到的。只不過setInterval(fun(), 3000)執行後 會報錯的,其調用錯誤。在以前已經講過了,這裏就不囉嗦了!code

------------------------------------------------------------------------------------------------
爲了讓你們明白 setInterval("fun()",1000)  的調用是以可執行代碼 執行。給出如下代碼共你們測試:xml

    var a =10;
    var b = 20;
    var c = a+b;
window.onload = function(){
    var a =1;
    var b = 2;
    var c = a+b;
    setInterval("alert(c);",1000);  //30
}
function fun() {
            alert(1);
        }
        setInterval("alert(fun)",2000);
setInterval("var a=1;var b=2;c=a+b;alert(c);",1000); //你們說這個會是什麼呢 ?
相關文章
相關標籤/搜索