当前位置: 代码迷 >> JavaScript >> 为什么函数内的值在每次调用时都不会更新?
  详细解决方案

为什么函数内的值在每次调用时都不会更新?

热度:43   发布时间:2023-06-05 14:18:32.0
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每次调用时都不会更新。

因为所有的回调函数有相同的变量 ,参考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

因为表达式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)
}

确实在调用函数时更新 但是直到延迟后才显示该值。 第一次打印输出发生在对a()的第三次实际调用之后很长时间,因此这是所有三个调用所显示的成员变量的第三次更新。 Fershtay?

如果希望它打印三个单独的值,则不要使用该对象的属性来保存该值,只需将其保留在该函数局部的变量中即可。

  相关解决方案