3

オブジェクトだけがうまくエクスポートされる理由がわかりません。あれ見て:

最初のファイル

var a = exports.a = {};
var b = exports.b = 0;

exports.xxxxx = function(){

    a.hello = 'help';
    b = 104;

};

2番目のファイル

var a = require('firstfile').a;
var b = require('firstfile').b;

module.exports = function(){

    console.log(a); // {hello:'help'}
    console.log(b); // 0

};

なんで ?

エクスポートbのソリューションは次のようになります。

最初のファイル:

...
a.hello = 'help';
exports.b = 104; // (add exports)
...

2番目のファイル:

...
var b = require('firstfile');
...
console.log(b.b); // 104

なんで?

編集

わかったと思います。

変数aは単なる参照です!私は理解していない人に説明します:

  • 最初のファイルが読み取られると、a = {}, b = 0
  • bを変更すると、bは変更されますが、モジュール(エクスポート)は変更されません!!
  • exports.b = 104//これでモジュールの値を変更するのは正常です!誰が必要です。

さて、なぜオブジェクトが違うのですか?

  • ファイル2が実行されるとき。(1回実行)、a={}の値。
  • しかし、それは{xxx:xxx}を表示します
  • これは、ファイルが実行されたときのaの値が{}ではなく、このオブジェクトの参照であるためです。
  • したがって、このオブジェクトを取得する必要がある場合は、すべての参照を検索します。

2つのことを覚えておくことが重要です。

  • 関数から必要なモジュールは一度読み取られます!変更を確認するには、関数で要求する必要があります。
  • オブジェクトの在庫参照。

さよなら!この助けを願っています!

4

1 に答える 1

1

に割り当てる0exports.b、基本的に定数値として割り当てられます。変数が指す値を更新できますがb、再エクスポートされません。

たとえば、getB関数を追加して、投稿内容を少し変更しました。

var a = exports.a = {};
var b = exports.b = 0;

exports.xxxxx = function(){

    a.hello = 'help';
    b = 104;

};

exports.getB = function() { return b; };

次に、REPLでこのファイルを試してみることで、私が何を意味するのかがわかります。

> var example = require('./example.js');
undefined
> example
{ a: {},
  b: 0,
  xxxxx: [Function],
  getB: [Function] }
> example.xxxxx()
undefined
> example.getB()
104
> example.b
0
>

編集:参照に関するあなたのコメントはやや正しいです。あなたが最初に言うとき

var b = exports.b = 0;

2つの変数が同じ値を指していると言っています。これは、同じ参照(で行ったようにオブジェクト)を指す2つの変数とは異なりますa。一方の値を変更しても、もう一方の値は変更されません。つまり、値を0から1に変更する場合、0コード内のすべてのインスタンスもそのようにしたくはありません1。それは良くないでしょう。

b値になり、その値を変更するたびに更新されるようにする場合は、を再割り当てする必要がありますexports.b。これは、ほとんどのコードが1つのオブジェクトとしてエクスポートされていると見なされる理由の一部です...その後、エクスポートは参照のように扱われ、すべてのコードがb期待どおりに更新されます。

于 2012-05-17T19:46:19.133 に答える