我在书You Don't Know JS: this
& Object Prototypes:
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()
下声明了一个属性。
答案 0 :(得分: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++;
}
...但这不是通用的,因为你需要&#34;硬编码&#34;函数的名称。
另一种方法是使用闭包来创建一个使用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 :(得分:0)
你有点自己回答了这个问题。
功能也是对象。
在第一步中,您可以像这样定义函数
user nginx;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /git/ {
proxy_pass http://127.0.0.1:3333/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
调用function foo(num) {
console.log( "foo: " + num );
this.count++;
}
现在只需在Object foo上创建一个属性。要阅读有关Javascript中对象的更多信息,请阅读this。
在你的例子中要注意的一件事是你如何调用函数foo。因为foo.count = 0
会有所不同,具体取决于您的调用方式。
在浏览器控制台中粘贴示例,然后调用foo.count将打印0。
这是因为this
将绑定到全局上下文。阅读here。
作为练习,您可以尝试弄清楚如何使计数正常工作。