在Javascript对象中var vs this

时间:2011-02-09 15:04:15

标签: javascript node.js

我正在为node.js开发一个web框架。这是代码;

function Router(request, response) {
        this.routes = {};

        var parse = require('url').parse;

        var path = parse(request.url).pathname,
            reqRoutes = this.routes[request.method],
            reqRoutesLen = reqRoutes.length;

        ..... // more code

};

我应该将所有var更改为此,如下所示:

function Router(request, response) {
        this.routes = {};

        this.parse = require('url').parse;

        this.path = this.parse(request.url).pathname;
        this.reqRoutes = this.routes[request.method];
        this.reqRoutesLen = this.reqRoutes.length;

        ..... // more code

};

有任何意见吗?

4 个答案:

答案 0 :(得分:13)

如果希望属性在相关对象的生命周期中保持不变,则向this添加属性。使用var作为局部变量。

编辑 - 正如Bergi在评论中指出的那样,用var声明的变量在从函数调用返回时不会必然消失。它们是,并且只能直接访问声明它们的范围内的代码,以及词汇嵌套的范围。

答案 1 :(得分:1)

这取决于你想做什么。

如果使用var声明变量,则它们是函数的本地变量,无法在外部访问。

如果将变量分配给this,则它们将被设置为调用函数的上下文对象的属性。

所以,例如,如果你写:

var obj = new Router();

然后obj将所有变量作为属性,您可以更改它们。如果你打电话

somobject.Router()

然后将所有变量设置为someobject的属性。

答案 2 :(得分:1)

您可以将this挂起的属性视为其他语言中的实例变量(类似)。

看起来你正在创建一个构造函数,并且可能会添加一些原型方法。如果是这种情况,并且您需要访问routes,那么您已经获得了path,而不是Router.prototype = { doSomething: function(){ this.routes; // available path; // not available } }

{{1}}

答案 3 :(得分:1)

在构造函数中使用var通常用于私有变量,而使用this.用于公共变量。

this.的示例:

function Router() {
    this.foo = "bar";

    this.foobar = function () {
         return this.foo;
    }
}

var r = new Router();
r.foo // Accessible

var的示例:

function Router() {
    var _foo = "bar";

    this.foobar = function () {
         return _foo;
    }
}

var r = new Router();
r._foo // Not accessible