Javascript 模块模式中变量的范围

Javascript 模块模式中变量的范围,javascript,Javascript,我试图理解如何在下面的脚本中触摸/更改/增加我的私有作用域变量x。我在这里使用的是模块模式,我认为我可以从公共返回模块声明的属性或方法中访问并设置私有变量,但我尝试的都不起作用。相关:与作为静态变量访问func相比,何时声明func的新实例 var func=函数{ var x=1; var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; } 返回{ X:X, Xq:squareX, AddOne:AddOne }; }; 函数X=9;//应为私有作用域x=

我试图理解如何在下面的脚本中触摸/更改/增加我的私有作用域变量x。我在这里使用的是模块模式,我认为我可以从公共返回模块声明的属性或方法中访问并设置私有变量,但我尝试的都不起作用。相关:与作为静态变量访问func相比,何时声明func的新实例

var func=函数{ var x=1; var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; } 返回{ X:X, Xq:squareX, AddOne:AddOne }; }; 函数X=9;//应为私有作用域x=9 func.AddOne;//应为私有作用域x=10
document.writefunc.Xq;//期望100实际=1你需要一个设定者,你需要一个生活:

var func=函数{ var x=1; var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; } 返回{ X:函数值{ 如果值!==未定义{ x=值; } return x;//我们也可以将其用作getter! }, Xq:squareX, AddOne:AddOne };
}; // 你需要一个设定者,你需要一个生活:

var func=函数{ var x=1; var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; } 返回{ X:函数值{ 如果值!==未定义{ x=值; } return x;//我们也可以将其用作getter! }, Xq:squareX, AddOne:AddOne };
}; // 模块模式的要点是创建一个从外部看不到的持久的私有范围。不幸的是,每次调用func时,都会创建一个包含新返回函数及其闭包的新作用域,因此所有操作都会被丢弃

不需要多次调用func,只需执行一次即可设置模块,您甚至可以立即使用,然后对结果执行操作

var func=函数{ var x=1;//这是私有变量 var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; }; 返回{ //注意,你不能只做X:X, //因为这只会创建一个副本; //你必须使用属性 获取X{return X;}, 设置Xval{x=val;}, Xq:squareX, AddOne:AddOne }; }; var funcModule=func; funcModule.X=9; funcModule.AddOne;
document.writefuncModule.Xq 模块模式的要点是创建一个从外部看不到的持久的私有范围。不幸的是,每次调用func时,都会创建一个包含新返回函数及其闭包的新作用域,因此所有操作都会被丢弃

不需要多次调用func,只需执行一次即可设置模块,您甚至可以立即使用,然后对结果执行操作

var func=函数{ var x=1;//这是私有变量 var squareX=函数{ 返回x*x; }; var addOne=函数{ x++; }; 返回{ //注意,你不能只做X:X, //因为这只会创建一个副本; //你必须使用属性 获取X{return X;}, 设置Xval{x=val;}, Xq:squareX, AddOne:AddOne }; }; var funcModule=func; funcModule.X=9; funcModule.AddOne;
document.writefuncModule.Xq 您正在使用显示模块模式隐藏您的私有实例变量。使用该模式时,必须使用某种setter来更改私有实例变量。这是另一个其他人也有同样问题的地方


我不建议您使用显示模块模式。事实上,我刚刚给出了一个标题为“显示模块是反模式”的例子。

您正在使用显示模块模式隐藏您的私有实例变量。使用该模式时,必须使用某种setter来更改私有实例变量。这是另一个其他人也有同样问题的地方


我不建议您使用显示模块模式。事实上,我刚刚给出了一个题为“显示模块是反模式”的答案。

您需要添加一个setter。X不是X。您已经设置了X:X,它只是将X的当前值复制到X中。它们无论如何都没有连接。您需要一个setter函数。您的func没有名为X的方法或属性。@JonathanM,嗯?当然可以。而且,每次使用func时,都是在创建一个具有完全独立的x的新函数。假设您打算使用IIFE?您需要添加一个setter。X不是X。您已经设置了X:X,它只是将X的当前值复制到X中。它们无论如何都没有连接。您需要一个setter函数。您的func没有名为X的方法或属性。@JonathanM,嗯?当然可以。而且,每次使用func时,都是在创建一个具有完全独立的x的新函数。想必你是有意的
想要使用IIFE?立即调用函数表达式立即调用函数表达式OK,没有意识到get;设置我们是javascript语言的一部分,随着我学习的深入,这种语言给我留下了深刻的印象。在另一个例子中,Matt演示了也可以将getter作为函数编写,所以这很酷;设置我们是javascript语言的一部分,随着我学习的深入,这种语言给我留下了深刻的印象。在另一个示例中,Matt演示了也可以将getter作为函数编写,所以这很酷。