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

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

-----------------------------------------------------------------------------------閉包

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

 

setTimeout的基本用法再也不重述,函數

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

 

bug:spa

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

  1) 字符串code;  code

  function test (){htm

    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 ]

相關文章
相關標籤/搜索