2011-02-09 38 views
7

Tôi đang phát triển một khung công tác web cho node.js. đây là mã;var so với đối tượng Javascript

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 

}; 

Tôi có nên thay đổi tất cả các var vào đó, như vậy:

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 

}; 

Bất kỳ ý kiến?

+3

Đây là một sự khác biệt khá cơ bản. Bạn có chắc bạn biết 'this' là gì và biến cục bộ là gì? – delnan

+0

Tôi có nền C++, Javascript cảm thấy lạ với tôi. –

+0

Trong trường hợp đó, bạn có đang phát triển một khuôn khổ web chỉ để giải trí hoặc học tập không? Các khung như thể hiện có thể là lựa chọn tốt hơn cho mã sản xuất của bạn trong khi bạn đang học. – 7zark7

Trả lời

13

Thêm thuộc tính vào this khi bạn muốn thuộc tính tồn tại với tuổi thọ của đối tượng được đề cập. Sử dụng var cho các biến địa phương.

chỉnh sửa — như Bergi ghi nhận trong một chú thích, các biến khai báo với var không thiết biến mất khi trở về từ một hàm gọi. Chúng là, và vẫn còn, chỉ có thể truy cập trực tiếp vào mã trong phạm vi mà chúng được khai báo, và trong các phạm vi lồng nhau từ từ.

+0

Lưu ý rằng các biến cục bộ có thể tồn tại với tuổi thọ của đối tượng là tốt nếu được tham chiếu từ một đóng cửa. – Bergi

1

Tùy thuộc vào những gì bạn muốn làm.

Nếu bạn khai báo các biến với var, thì chúng là cục bộ cho hàm và không thể truy cập bên ngoài.

Nếu bạn gán các biến cho this, thì chúng sẽ được đặt làm thuộc tính của đối tượng ngữ cảnh mà hàm được gọi.

Vì vậy, nếu ví dụ: nếu bạn viết:

var obj = new Router(); 

thì obj sẽ có tất cả các biến làm thuộc tính và bạn có thể thay đổi chúng. Nếu bạn gọi

somobject.Router() 

thì tất cả các biến sẽ được đặt làm thuộc tính của someobject.

1

Bạn có thể nghĩ rằng các thuộc tính được treo từ this giống như các biến mẫu trong các ngôn ngữ khác (loại).

Dường như bạn đang tạo hàm hàm dựng và có thể sẽ thêm một số phương thức mẫu thử nghiệm. Nếu đúng như vậy và bạn cần truy cập vào routes, bạn đã có nó, nhưng không phải là path.

Router.prototype = { 
    doSomething: function(){ 
    this.routes; // available 
    path; // not available 
    } 
} 
0

Sử dụng var trong các nhà xây dựng thường được sử dụng để biến tin khi sử dụng this. được sử dụng để biến công cộng.

Ví dụ với this.:

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

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

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

Ví dụ với var:

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

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

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

Cân nhắc thay đổi r.foo cuối cùng thành r._foo để thực sự làm cho điểm của bạn ... – ODaniel

+0

r.foo ---> r._foo xong. – radarbob

Các vấn đề liên quan