看看這段代碼:
var foo = { prop: 1 };
foo.count = 0;
console.log(foo.count); // 0
foo
可以是任何對象。它不必被初始化爲{}
。它可以是一個陣列(例如[1, 2, 3]
),日期(例如new Date()
),任何其他對象,所以也是一個函數:
var foo = function (num) {
console.log("foo: " + num);
};
foo.count = 0;
console.log(foo.count);
我寫的函數作爲分配給變量的函數表達式,以突出指出foo
被分配了一個對象。但它也可以與函數聲明語法:
function foo(num) {
console.log("foo: " + num);
}
foo.count = 0;
console.log(foo.count);
不要緊哪種對象foo
的是,只要是not read-only,你可以添加或覆蓋屬性的東西,如foo.count = 0
。
現在,以您的實際示例爲例:foo.count
似乎應該保留一次該函數調用次數的計數,但它不起作用,因爲this
不引用該函數,而是引用全局對象(即在瀏覽器中運行時爲window
)。
爲了解決這個問題,該功能可能看起來像:
function foo(num) {
console.log("foo: " + num);
foo.count++;
}
...但不是通用的,因爲你需要「硬編碼」的函數的名稱。
另一種方法是使用封閉,對於具有count
方法,而不是一個數值屬性(從this answer拍攝)創建一個函數:
var foo = (function() {
var count = 0;
// Create the actual function
var f = function (num) {
console.log("foo: " + num);
count++;
};
// ... and give it the count method
f.count = function() {
return count;
}
// Return that function (it will be assigned to foo)
return f;
})(); // immediately execute the above code: it returns a function
foo(2); // this increments count from 0 to 1.
console.log(foo.count()); // 1
你也可以說'obj.name ='value'來設置對象的屬性。當對象是一個函數時完全一樣。 – Thilo
@trincot:這本書實際上表達了同樣的觀點,代碼以'console.log(foo.count)結尾; // 0 - WTF?',這不會被OP複製。 – Amadan
我想這個問題更多的是關於'foo.count'。 – trincot