2011-09-11 15 views
6

kodu ile açıklamak kolay: beklendiği gibiDüğüm Modülleri - buna referans veren değişkenlere karşı dışa aktarma işlevlerini dışa aktarma?

##### 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 

ihraç işlevleri çalışmayabilir. m.count ayrıca 11.

cevap

13

exports.count = count

Sizin count değeri olmaya bir nesne exports üzerine bir özellik count ayar olmamasının sebebi Ama net değilim. Yani Her şey referansla geçmeyecek şekilde geçmektedir.

bir tür gibi gaz giderici olarak count tanımlamak için olsaydı:

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

, Sonra exports.count hep count mevcut değerini döndürecektir ve böylece hatam varsa 11

+2

Her şey değere göre değil! Fonksiyonlar ve nesneler her zaman referans olarak iletilir. – zetlen

+2

@zetlen no değerlerine göre geçirilir. Geçirdikleri değer bir nesneye referanstır. Referans olarak geçmek, işaretçilerdir. – Raynos

0

düzelt olabilir ama sayılar değişmez tiplerdir. count değerini değiştirdiğinizde, referansınız da değişir. Yani exports.count, eski count değerine başvuruyor.

0

JavaScript'te, işlevler ve nesneler (diziler dahil), değişkenlere referans olarak atanır ve dizeler ve sayılar, değere göre atanır - yani, bir kopya oluşturarak. var a = 1 ve var b = a ve b++ ise a hala bu satırda 1.

eşit olacaktır:

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

Eğer sayım değişkenin bir yan değere kopyasını yaptı. SetCount(), incCount() ve showCount() işlemlerinin tümü, kapağın içindeki sayım değişkeni üzerinde çalışır, böylece m.count tekrar dokunulmaz. Bu değişkenler this.count'ta çalışıyorsa, beklediğiniz davranışları elde edersiniz, ancak muhtemelen sayı değişkeni vermek istemezsiniz.

+0

göstergesine sahip değiliz. Javascript'te bu işaretçiler nerede? – Raynos

+1

Yeterince adil. Nesne atama/işlev atama ve dize atama arasındaki farkı tanımlamak için ne kullanırsınız? Hayır, bu bir değişmez bellek konumu değil, bir nesneye yapılan iki referans aynı nesneyi değiştirecek veya gösterecek ve bu bir dizge için geçerli değil. Ona ne diyorsun? – zetlen

+1

@zetlen, bu makaleyi şu sorulara cevap olarak vermektedir: https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions. Özünde, tüm JavaScript fonksiyonları-değer-değer. İlginç soru şu: ne kadar geçiyorlar? İlkel tipler için, veri tabanının kendisi ve ilkel olmayan türler için, varlığın lokalidir. – Thierry

İlgili konular