function test1(){
var n = 10;
setTimeout("alert(n)", 500);
}
function test2(){
var n = 10;
setTimeout(function(){alert(n)}, 500);
}
test1();
test2();
上面的代码中,执行test1会报错,提示n没有定义,执行test2会把10打印出来。
上面两个函数区别在哪里?
test1中报错n没有定义很正常,为什么test2可以输出n?
n在引号里是会认为是字符串而不是变量。
setTimeout("alert(n)", 500);第一个参数如果以字符串的形式传入的话,参数的执行上下文应该是变成了全局执行上下文,而全局环境中并没有声明n
setTimeout(function(){alert(n)}, 500);参数以匿名函数穿的话,仅仅是this指向了window,但是匿名函数可以访问到属于它作用域链里的n
假如n在全局作用域中声明,那么test1和test2都能访问到n