首先聲明本人資質尚淺,如有錯誤,歡迎指正、共同提高。
-----------------------------------------------------------------------------------
首先聲明:本文不重點討論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 ]
