Tim*_*rdy 6 javascript closures node.js
我需要一些帮助来理解NodeJ.我显然缺少一些基本的东西.我有一个类似于以下的模块,使用基本的显示模块模式...
var someArray = [];
var publicApi = {
someArray: someArray,
someFunction: someFunction
};
function someFunction() {
someArray = ['blue', 'green'];
}
module.exports = publicApi;
Run Code Online (Sandbox Code Playgroud)
当我使用这个模块时,someArray在我调用someFunction时没有改变...
var myModule = require('myModule');
myModule.someFunction();
var test = myModule.someArray;
// test is always an empty array
Run Code Online (Sandbox Code Playgroud)
请帮我理解原因.我意识到我可以使用构造函数来使用它,但我想填补我的知识,为什么以上不起作用.
更新:
我可以通过以下对模块的修改来实现这一点......
var theModule = {
someArray: [],
someFunction: someFunction
};
function someFunction() {
theModule.someArray = ['blue', 'green'];
}
module.exports = theModule;
Run Code Online (Sandbox Code Playgroud)
但我仍然想明白为什么第一个模块中的代码不起作用.我正在处理的模块很好,作为一个单例,所以我很想看看在模块中有变量的最佳实践是什么,可以通过该模块中的函数进行更改,并且可以在该模块之外公开访问.
第一种方法不起作用的原因与在没有 Node 的 JavaScript 中无法执行相同操作的原因相同:
var someArray = [];
var object = {
someArray: someArray,
}
someArray = [1, 2, 3];
console.log(object.someArray);
Run Code Online (Sandbox Code Playgroud)
打印此内容是[]因为它object.someArray是对您创建的第一个数组的引用。这是过程:
var someArray = [];
Run Code Online (Sandbox Code Playgroud)
创建一个空数组,然后保存对该数组的引用作为名称someArray。我们就这样称呼吧array1。
var object = {
someArray: someArray
}
Run Code Online (Sandbox Code Playgroud)
创建一个具有属性的对象someArray,使该属性引用所引用的someArray数组。重要的是要知道这意味着该引用现在是对 的引用array1,而不是对 的引用someArray。这导致我们:
someArray = [1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
它创建一个新数组(我们称之为array2),然后将其存储为someArray. 该数组完全独立于will get的array1所有未来引用,但对之前的访问没有影响。someArrayarray2
这与您的 Node 示例完全相同 - 当您覆盖someArray而不是 时publicApi.someArray,您不会对 进行任何更改publicApi.someArray,因此您不能期望它有所不同。
为了清楚地说明这一点,您可以从以下内容开始:
someArray -> array1[]
object.someArray -> array1[]
Run Code Online (Sandbox Code Playgroud)
对此:
someArray -> array2[1, 2, 3]
object.someArray -> array1[]
Run Code Online (Sandbox Code Playgroud)
请注意,它object.someArray没有改变。
| 归档时间: |
|
| 查看次数: |
1232 次 |
| 最近记录: |