首先声明本人资质尚浅,若有错误,欢迎指正、共同提升。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 ]