2016-08-25 81 views
-1

我碰到這條信息在書中You Don't Know JS: this & Object Prototypes傳來:Javascript:什麼是函數屬性,它有什麼意義?

function foo(num) { 
    console.log("foo: " + num); 
    this.count++; 
} 

foo.count = 0; 
for (var i=0; i<10; i++) { 
    if (i > 5) { 
     foo(i); 
    } 
} 

現在,它後來提到...

當代碼執行foo.count = 0,確實它的加入財產count到功能對象foo

我不明白什麼是一個函數的屬性,以及如何以這種方式聲明它。

我明白一個函數也是JS中的一個對象,但我不明白函數屬性的意義。此外,一個對象的屬性的定義是這樣的:

var obj = {name: 'value'}; 

但如何才能foo.count=0 - 出function foo()範圍 - foo()下聲明屬性。

+2

你也可以說'obj.name ='value'來設置對象的屬性。當對象是一個函數時完全一樣。 – Thilo

+0

@trincot:這本書實際上表達了同樣的觀點,代碼以'console.log(foo.count)結尾; // 0 - WTF?',這不會被OP複製。 – Amadan

+0

我想這個問題更多的是關於'foo.count'。 – trincot

回答

2

看看這段代碼:

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 
+1

你甚至不應該向新手提及*'arguments.callee'。它已被棄用和遺忘,請離開它。 – Bergi

+1

謝謝您的好評,@Bergie。儘管我已經明確提到了已棄用的狀態,但我現在已將其替換爲另一個未棄用的解決方案。 – trincot

0

你自己那種回答了這個問題。

函數也是對象。

第一步定義,像這樣

function foo(num) { 
    console.log("foo: " + num); 
    this.count++; 
} 

調用foo.count = 0現在剛剛創建的對象foo屬性的功能。要閱讀更多關於Javascript中的對象,請閱讀this

在你的例子中要注意的一件事是你如何調用函數foo。因爲this將根據您的調用方式而有所不同。

粘貼您的例子在你的瀏覽器控制檯,然後調用foo.count將打印0

這是因爲this必將給全球語境。請閱讀here

作爲練習,您可以嘗試弄清楚如何正確計數。

相關問題