javascript - 解释以下 JS 代码的行为(闭包)

标签 javascript closures iife

我想知道为什么会有如此奇怪的行为,因为variableOne应该是相同的。

myfun = (function() {
            var variableOne = 10;
            get = function(){
            return variableOne;
            }
            set = function(value){
            variableOne = value;
            }
            return {variableOne,set,get};
            })();
        // Console Window Output
        console.log(myfun.variableOne);    
        >>10
        myfun.variableOne = 90;
        myfun.get()
        >>10

为什么variableOne的值没有更改为90。

最佳答案

发生这种情况是因为 variableOne 是一个原始值 - 原始值是按值复制的,而不是按引用复制的,因此一旦在return (顺便说一句,这是通过使用“对象文字属性值简写”创建属性,而不是解构赋值)完成,现在它们是两个单独的变量。附带说明 - 正如我所说,对象是通过引用复制的,但您仍然可以使用赋值运算符更改引用本身(您可以在此处的另一个 SO 问题中阅读有关此内容的更多信息: Is JavaScript a pass-by-reference or pass-by-value language? )。

更重要的是,get 方法访问返回对象之外的 variableOne - 闭包中定义的对象(即使它仍然存在)关闭已经执行)。

set 方法实际上并不是属性 setter ,因为创建 setter 需要您传递属性名称。在本例中,这只是另一个常规对象方法。

关于javascript - 解释以下 JS 代码的行为(闭包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45649358/

相关文章:

javascript - 将 haml 文件转换为 html 时复制整个文件夹结构(使用 grunt)

javascript - 如何更改表中多个 anchor 的 Href?

JavaScript 闭包行为异常

javascript - JS的IIFEs(立即调用的函数表达式)位置导致意外错误

javascript - 立即调用函数表达式 : Where to put the parenthesis?

javascript - javascript 中的函数用括号括起来

javascript - jQuery Load 不解析 HTML 变量

javascript - HTML5 中的 Canvas 大小

javascript:创建全局变量的本地范围会在设置之前取消定义它

python - 仅给定闭包函数,如何访问闭包变量?