问题描述
function a(delay){
this.randomVal = Math.random();
window.setTimeout(function(){
document.write('function a called - '+this.randomVal+' '+delay+'<br/>');
}, delay)
}
a(2000);
a(5000);
a(1000);
结果输出:
function a called - 0.7679888338316232 1000
function a called - 0.7679888338316232 2000
function a called - 0.7679888338316232 5000
我确定这是一个经典问题,但是为什么函数'a'中的randomVal每次调用时都不会更新。
1楼
Felix Kling
3
已采纳
2011-03-30 12:54:39
因为所有的回调函数有相同的变量 ,参考this.randomVal
,这是全局对象(的属性window
)( this
指的window
在你的情况)。
因此,您的代码基本上与以下代码相同:
function a(delay){
randomVal = Math.random();
// ...
}
到第一个回调函数被调用时,您已经第三次调用a
,因此所有回调函数都将访问在上一次调用中设置的this.randomVal
的值。
这可以通过使用var
代替if this
轻松解决,从而使其成为局部变量而不是全局 变量 :
function a(delay){
var randomVal = Math.random();
window.setTimeout(function(){
document.write('function a called - ' + randomVal + ' ' + delay + '<br/>');
}, delay)
}
(并且请不要使用document.write
) 。
2楼
Franck Freiburger
3
2011-03-30 12:55:11
因为表达式document.write('function a called - '+this.randomVal+' '+delay+'<br/>');
如果“稍后”执行,则this.randomVal
的值是this.randomVal = Math.random();
生成的最新值this.randomVal = Math.random();
您可以通过创建闭包来解决此问题:
function a(delay){
var randomVal = Math.random();
window.setTimeout(function(){
document.write('function a called - '+randomVal+' '+delay+'<br/>');
}, delay)
}
3楼
Ernest Friedman-Hill
1
2011-03-30 12:54:34
确实会在调用函数时更新。 但是直到延迟后才显示该值。 第一次打印输出发生在对a()的第三次实际调用之后很长时间,因此这是所有三个调用所显示的成员变量的第三次更新。 Fershtay?
如果希望它打印三个单独的值,则不要使用该对象的属性来保存该值,只需将其保留在该函数局部的变量中即可。