了解Javascript中的IIFE范围

了解Javascript中的IIFE范围,javascript,iife,Javascript,Iife,我遇到了类似的事情。有人能帮我理解为什么会发生这种行为吗。这和生活的范围有关吗 const iife = (() => { let myValue = "Previous"; const getValue = () => myValue; const setValue = (val) => {myValue = val} return { myValue:myValue, getValue:getValue

我遇到了类似的事情。有人能帮我理解为什么会发生这种行为吗。这和生活的范围有关吗

const iife = (() => {
    
    let myValue = "Previous";
    const getValue = () => myValue;
    const setValue = (val) => {myValue = val}

return {
    myValue:myValue,
    getValue:getValue,
    setValue:setValue
}

})()

//console outputs
iife //{myValue:"Previous", getValue:f, setValue:f}
iife.setValue("New");
iife.getValue() //"New"
iife // {myValue:"Previous", getValue:f,setValue:f}

如何才能获取
iife.getValue()=“New”
值,即使它没有为
myValue
变量更改?

setValue
更改
iife
函数中的值。返回新对象时,它将创建
myValue
变量的副本,因此
iife.myValue!==myValue
。如果您按如下方式修改代码,则可以看到它:

const iife=(()=>{
让myValue=“先前”;
const getValue=()=>myValue;
常量setValue=(val)=>{myValue=val}
setInterval(()=>console.log(myValue),100)
返回{
myValue:myValue,
getValue:getValue,
setValue:setValue
}
})()
//控制台输出
iife/{myValue:“先前”,getValue:f,setValue:f}
生命设定值(“新”);
iLife.getValue()/“新建”
iife/{myValue:“先前”,getValue:f,setValue:f}

它将打印你在生活中输入的任何内容。设置值

好的,明白了!所以基本上,iife.myValue没有被更改,因为没有办法将myValue数据写回它。这只是第一次调用时保留的副本。但是在内部,myValue已经被setValue函数改变了。是的,就是这样,两者都是不同的变量