看看这段代码:
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