2011-09-11 3 views
6

コードで説明するのが最も簡単:予想通りノードモジュール - それを参照する関数のエクスポートとエクスポート

##### module.js 
var count, incCount, setCount, showCount; 
count = 0; 

showCount = function() { 
return console.log(count); 
}; 
incCount = function() { 
    return count++; 
}; 
setCount = function(c) { 
    return count = c; 
}; 

exports.showCount = showCount; 
exports.incCount = incCount; 
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself 

#### test.js 
var m; 
m = require("./module.js"); 
m.setCount(10); 
m.showCount(); // outputs 10 
m.incCount(); 
m.showCount(); // outputs 11 
console.log(m.count); // outputs 0 

エクスポート機能が働きます。 m.countも11

答えて

13

exports.count = count

あなたがcountの値になるようにオブジェクトexportsのプロパティcountを設定しない理由しかし、私は明確ではありませんよ。私。 0

すべてが値渡しであり、参照渡しではありません。

あなたは、のようなゲッターとしてcountを定義した場合:

Object.defineProperty(exports, "count", { 
    get: function() { return count; } 
}); 

が、その後exports.countは常にcountの現在の値を返しますので、私が間違っている場合は11

+2

値渡しがすべてではありません!関数とオブジェクトは常に参照渡しされます。 – zetlen

+2

@zetlenいいえ値で渡されます。彼らが渡している値は、オブジェクトへの参照です。参照渡しはポインタです。ポインタはありません – Raynos

0

が私を修正してもよいが、数字不変型です。 countの値を変更すると、参照も変更されます。したがって、の値を参照すると、exports.countとなります。

0

JavaScriptでは、ファンクションとオブジェクト(配列を含む)は参照によって変数に割り当てられ、文字列と数字は値によって、つまりコピーを作成することによって割り当てられます。 var a = 1var b = ab++場合、aはまだこの行で1

に等しくなります。

exports.count = count; // let's also export the count variable itself 

はあなたがカウント変数の値によるコピーを作りました。 setCount()、incCount()およびshowCount()操作はすべてクロージャー内のcount変数で動作します。したがって、m.countは再び触れません。これらの変数がthis.countで動作していた場合は、期待どおりの動作が得られますが、カウント変数をエクスポートしたくないと思われます。

+0

"参照"はポインタを意味します。私たちはjavascriptでこれらのポインタはどこですか? – Raynos

+1

十分に良い。オブジェクトの割り当て/関数の割り当てと文字列の割り当ての違いを説明するために、あなたは何を使用しますか?いいえ、それはリテラルメモリロケーションではありませんが、オブジェクトへの2つの参照は同じオブジェクトを変更または表示しますが、それは文字列に当てはまりません。あなたはそれを何と呼びますか? – zetlen

+1

@zetlen、この記事はあなたの質問に簡潔に答えます:https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions。本質的に、すべてのJavaScript関数は値渡しです。興味深いのは、どのような価値があるのでしょうか?プリミティブ型の場合、それはデータそのものであり、非プリミティブ型の場合はエンティティのローカルです。 – Thierry

関連する問題