Javascript 使用;这";在嵌套的模块化方法中,保留名称空间

Javascript 使用;这";在嵌套的模块化方法中,保留名称空间,javascript,module-pattern,Javascript,Module Pattern,我有一个巨大的JavaScript整体,并使用基于模块的方法使其更结构化 但是,对于如何在嵌套函数中使用“this”关键字而不相互覆盖,我有点不知所措,如下面的示例所示 函数水果(){ const self=这个; 这个.fruits=[]; this.addFruit=函数(水果){ 自我。水果。推(水果); }; //本地购买 this.localStore=(函数(){ const self_localStore=this; this.buyArray=[]; this.buy=功能(水

我有一个巨大的JavaScript整体,并使用基于模块的方法使其更结构化

但是,对于如何在嵌套函数中使用“this”关键字而不相互覆盖,我有点不知所措,如下面的示例所示

函数水果(){
const self=这个;
这个.fruits=[];
this.addFruit=函数(水果){
自我。水果。推(水果);
};
//本地购买
this.localStore=(函数(){
const self_localStore=this;
this.buyArray=[];
this.buy=功能(水果){
console.log(“本地购买”);
self_localStore.buyArray=this;
};
归还这个;
})();
//从网上商店购买
this.onlineStore=(函数(){
const self_onlineStore=此;
this.buyArray=[];
this.buy=功能(水果){
console.log(“在线购买”);
self_onlineStore.buyArray=this;
};
归还这个;
})();
归还这个;
}
让水果=新水果();

水果。本地商店。购买(“苹果”);/>在线购买,而不是本地购买
您正在两个函数中创建函数变量。但是这个.onlinestore重写了水果的函数变量。这与setter函数没有什么不同。想一想,你可以用两种不同的方法设置一个变量。从上到下,在在线商店功能中,您覆盖this.buy方法

您可以使用下面的示例

函数水果(){
const self=这个;
这个.fruits=[];
this.addFruit=函数(水果){
自我。水果。推(水果);
};
//本地购买
this.localStore=()=>{
console.log(“本地存储”);
const self_localStore=this;
this.buyArray=[];
this.buy=功能(水果){
console.log(“本地购买”);
self_localStore.buyArray=this;
};
归还这个;
};
//从网上商店购买
this.onlineStore=()=>{
console.log('在线商店')
const self_onlineStore=此;
this.buyArray=[];
this.buy=功能(水果){
console.log(“在线购买”);
self_onlineStore.buyArray=this;
};
归还这个;
};
归还这个;
}
让水果=新水果();

水果。本地商店()。购买(“苹果”);/>在线购买,而不是本地购买
您正在两个函数中创建函数变量。但是这个.onlinestore重写了水果的函数变量。这与setter函数没有什么不同。想一想,你可以用两种不同的方法设置一个变量。从上到下,在在线商店功能中,您覆盖this.buy方法

您可以使用下面的示例

函数水果(){
const self=这个;
这个.fruits=[];
this.addFruit=函数(水果){
自我。水果。推(水果);
};
//本地购买
this.localStore=()=>{
console.log(“本地存储”);
const self_localStore=this;
this.buyArray=[];
this.buy=功能(水果){
console.log(“本地购买”);
self_localStore.buyArray=this;
};
归还这个;
};
//从网上商店购买
this.onlineStore=()=>{
console.log('在线商店')
const self_onlineStore=此;
this.buyArray=[];
this.buy=功能(水果){
console.log(“在线购买”);
self_onlineStore.buyArray=this;
};
归还这个;
};
归还这个;
}
让水果=新水果();
水果。本地商店()。购买(“苹果”);/>在线购买,而不是在编写时在本地购买,
等于
窗口
未定义
(取决于您是否使用严格模式):

(function(){console.log(this===window);}()//True
当您编写时,
this
等于
window
未定义的
(取决于您是否使用严格模式):


(function(){console.log(this===window);})(///True
感谢您的输入,但您的解决方案的不同之处在于,您不是直接调用
localStore
onlineStore
,而是在调用该方法时执行,这可能会让您觉得执行
fruit.localStore().buy(“苹果”)而不是
水果。本地商店。购买(“苹果”)
感谢您的输入,但您的解决方案的不同之处在于,您不需要直接调用
localStore
onlineStore
,而是在调用该方法时执行,这可能会让您觉得执行
fruit.localStore().buy(“苹果”)而不是
水果。本地商店。购买(“苹果”)
我已经知道您的前两条带有代码片段的语句,但我仍然非常感谢它们,谢谢!此外,我也知道对象文字是一种解决方案,但除了所有其他类型的基于模块的方法之外,拥有它们感觉不太合适。那么,有没有办法使用
localStore
onlineStore
being方法呢?我不明白为什么你想让它们成为方法,而你使用
fruit.localStore.buy(“苹果”)
这清楚地表明
localStore
应该是一个对象。什么是“感觉不对劲”?困扰您的是没有真正的封装,对象及其
buyArray
属性可以从外部访问?我想我只是习惯于使用声明方法遵循模块模式,每个方法代表代码的一个“区域”,同时,使用点表示法访问一级方法或带有“区域”前缀的子级方法。我在后端和前端都工作,不知怎么的,我痴迷于类似的结构。我已经更新了我的答案,以提供我认为你想要的。我明白了,我想我不会随便返回一个对象。似乎我必须使用
返回{…this}
来包含所有方法。好吧,我现在接受了你的答案,尽管我希望有其他的东西:pI已经知道你的前两条带有代码片段的语句,但我仍然很感激它们