2 yang 3cd yang_3cd 于 2014.08.02 13:12 提问

javascript在函数中使用setTimeout变量的作用域问题

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?

2个回答

CLAYTON8011
CLAYTON8011   2016.01.13 14:36

n在引号里是会认为是字符串而不是变量。

qq_21228539
qq_21228539   2016.08.27 12:57

setTimeout("alert(n)", 500);第一个参数如果以字符串的形式传入的话,参数的执行上下文应该是变成了全局执行上下文,而全局环境中并没有声明n
setTimeout(function(){alert(n)}, 500);参数以匿名函数穿的话,仅仅是this指向了window,但是匿名函数可以访问到属于它作用域链里的n
假如n在全局作用域中声明,那么test1和test2都能访问到n

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!