js 定時器(setTimeout/setInterval)出現變量未定義(xxx is not defined) 的解決方法


首先聲明本人資質尚淺,如有錯誤,歡迎指正、共同提高。

-----------------------------------------------------------------------------------

首先聲明:本文不重點討論this作用域,而是討論普通變量在定時器中容易報錯的情況;

 

setTimeout的基本用法不再重述,

詳見:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp

 

bug:

  setTimeout的第一個參數有兩種形式: 

  1) 字符串code;  

  function test (){

    var a=1;

    setTimeout("a++",100);//a is not defined;

  }

  test();

 

  2) 函數形式;

  function test (){

    var a=1;

    setTimeout(function(){

      a++;

      console.log(a); //正常運行,卻打印出結果2;

    },100);

  }

  test();

 

為什么第一種情況容易出錯呢?

我們知道,setTimeout方法是掛在window對象下的。《JavaScript高級程序設計》第二版中,寫到:“超時調用的代碼都是在全局作用域中執行的,因此函數中this的值在非嚴格模式下指向window對象,在嚴格模式下是undefined”。在這里,我們只討論非嚴格模式。

因而對於第一種形式(string code)的情況,定時器匯總調用的是全局變量a,而上下文中定義的變量是局部變量,所以會報錯;

對於第二種形式(函數形式)可以這么理解:在這里匿名函數的使用形成了一個閉包,從而能訪問到外層函數的局部變量。只是這種閉包,跟常見的閉包不同,因為函數式放在setTimeout里面。

 

 

-------------------------------------------------------------------------------

如有錯誤,歡迎評論指正、共同提高。[握手]    

歡迎轉載,轉載請注明:轉載自[ http://www.cnblogs.com/juneling ]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM