首先聲明本人資質尚淺,若有錯誤,歡迎指正、共同提升。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 ]