Javascript:什么是函数属性,它的意义是什么?

时间:2016-08-25 06:35:22

标签: javascript

我在书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()下声明了一个属性。

2 个答案:

答案 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

作为练习,您可以尝试弄清楚如何使计数正常工作。