我只是在做实验,这让我很困惑.我不明白为什么两次调用foo会影响上一次调用的超时回调的输出.此代码:

let state = {
    age: 0
};
let getState = () => {
     let setState = () => {
        state = {
            age: state.age + 1
        }
    }
    return {
        state,
        setState
    }
}

function foo() {
    let {
        state:st,
        setState
    } = getState();
    replicaUseEffect = () => {
        console.log("replicaUseEffect", st);
    }
    console.log("before", st);

    setState()
    console.log("after", st);


    setTimeout(() => replicaUseEffect(), 1000)
};
foo();

产生以下输出,我或多或少都同意:

"before", {
  age: 0
}
"after", {
  age: 0
}
"replicaUseEffect", {
  age: 0
}

现在,只需给foo打两次电话:

foo();
foo();

结果是:

"before", {
  age: 0
}
"after", {
  age: 0
}
"before", {
  age: 1
}
"after", {
  age: 1
}
"replicaUseEffect", {
  age: 1
}
"replicaUseEffect", {
  age: 1
}

为什么在第二个示例中,两次调用foo会影响both replicaUseEffect个值,并两次输出1?

推荐答案

这两个replicaUseEffect次调用输出相同的值的原因是,replicaUseEffect已被定义为全局变量,因此foo replaces的第二次调用使用了新的replicaUseEffect来替换以前版本的replicaUseEffect.虽然它的代码完全相同,但它位于不同的闭包中,第二个执行上下文的st局部变量为foo.

如果将replicaUseEffect定义为局部变量,则不会产生这种效果:

let state = {
    age: 0
};
let getState = () => {
     let setState = () => {
        state = {
            age: state.age + 1
        }
    }
    return {
        state,
        setState
    }
}

function foo() {
    let {
        state:st,
        setState
    } = getState();
    const replicaUseEffect = () => {
        console.log("replicaUseEffect", st);
    }
    console.log("before", st);

    setState()
    console.log("after", st);


    setTimeout(() => replicaUseEffect(), 1000)
};
foo();
foo();

Javascript相关问答推荐

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

如何解决CORS政策的问题

JQuery. show()工作,但. hide()不工作

点击按钮一次有文本出现和褪色,而不是点击两次?(html,CSS,JavaScript)

如何使覆盖div与可水平滚动的父div相关?

如何使用JavaScript将文本插入空div

在Three JS中看不到补间不透明度更改效果

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

如何使onPaste事件与可拖动的HTML元素一起工作?

Reaction组件在本应被设置隐藏时仍显示

元素字符串长度html

JavaScript不重定向配置的PATH

在JS中动态创建对象,并将其追加到HTML表中

WebSocketException:远程方在未完成关闭握手的情况下关闭了WebSocket连接.&#三十九岁;

背景动画让网站摇摇欲坠

P5.js中矩形内的圆弧

是否设置以JavaScript为背景的画布元素?

JavaScript:多个图像错误处理程序

重新渲染过多(&Q).REACT限制渲染次数以防止无限循环.使用REACT下拉菜单时

MUI-TABLE:MUI表组件中交替行的不同 colored颜色 不起作用