2011-09-11 57 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

你的對象exports上設置屬性count是的count值。即0.

一切都是通過價值不通過參考。

如果你定義count像這樣一個getter:

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

然後exports.count總是返回count當前價值,從而成爲11

+2

並非所有事情都是按價值傳遞!函數和對象總是通過引用傳遞。 – zetlen

+2

@zetlen沒有他們通過價值。它們傳遞的值是對對象的引用。按引用傳遞是指針。我們沒有指針 – Raynos

0

糾正我,如果我錯了,但數是不可變的類型。當您更改count的值時,您的參考也會發生變化。所以exports.count引用了舊的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上運行,那麼你會得到你期望的行爲 - 但是你可能不想導出count變量。

+0

「通過引用」意味着指針。 JavaScript中的這些指針在哪裏? – Raynos

+1

夠公平的。你會用什麼來描述對象賦值/函數賦值和字符串賦值之間的區別?不,它不是一個文字內存位置,但是兩個對象的引用將會修改或顯示同一個對象,而這不是一個字符串。你叫什麼? – zetlen

+1

@zetlen,這篇文章簡潔地回答你的問題:https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions。實質上,所有JavaScript函數都是按值傳遞的。有趣的問題是:他們傳遞了什麼價值?對於原始類型,它是數據本身,對於非原始類型,它是實體的本地。 – Thierry