2012-08-14 26 views
5

Sau câu hỏi cuối cùng của tôi, điều này là chính xác hơn đối với tôi:“var” biến "này" biến và các biến "toàn cầu" - bên trong một Constructor Javascript

dụ:

function Foo() { 
    this.bla = 1; 
    var blabla = 10; 
    blablabla = 100; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 
foo = new Foo(); 

những gì tôi hiểu ngay bây giờ:

this.bla = 1;  // will become an attribute of every instance of FOO. 
var blabla = 10; // will become a local variable of Foo(will **not** become an attribute of every instance of FOO), which could be accessed by any instance of FOO - only if there's a method like "this.getBlabla". that's a "closer" ? 
blablabla = 100; // will define a **new** (or change if exist) global(window) variable. 

Tôi có hiểu chính xác không?

Ngoài ra - nếu tôi bao gồm var blabla = 10; và chức năng getblabla sử dụng nó trong nhà thầu, sau đó cho mọi trường hợp của Foo ("foo" ...), sẽ được lưu một hàm Foo nhà thầu trong bộ nhớ bao gồm biến "riêng tư". hoặc sẽ có cùng chức năng Foo với vị trí cho các biến riêng tư - cho TẤT CẢ các trường hợp (như "foo") của Foo?

+0

Ba xác nhận đầu tiên của bạn là chính xác. Tôi không hoàn toàn làm theo những gì bạn đang yêu cầu cho câu hỏi cuối cùng của bạn. Bạn có thể làm rõ?Bạn cũng có thể thử các biến không được đặt tên tương tự như vậy không? Thật khó để làm theo. Cảm ơn. – Brad

+0

Nó cũng phức tạp với tôi. Tôi có nghĩa là - tha thứ một đóng cửa, phải không? và đó là một nhà thầu - vì vậy, đối với mọi trường hợp của Foo, sẽ có một đóng cửa mới của Foo trong bộ nhớ? công cụ này hoạt động như thế nào? cảm ơn. – Daniel

Trả lời

6

Chỉ cần tập trung vào phạm vi, tôi sẽ chạy qua ví dụ này, (với rõ ràng hơn biến) Sau đó, tôi sẽ kết nối nó trở lại biến của bạn.

var x = "Global scope"; 
var y = "Not changed."; 

function Foo() { 
    this.x = "Attribute of foo"; 
    var x = "In foo's closure"; 
    y = "Changed!" 
    this.getX = function() { 
     return x; 
    } 
} 

// do some logging 

console.log(x); // "Global scope" 
console.log(y); // "Not changed" 
foo = new Foo(); 
console.log(y); // "Changed!" 
console.log(foo.x); // "Attribute of foo" 
console.log(x); // "Global scope" 
console.log(foo.getX()); // "In foo's closure" 

Dòng: this.x tương đương với this.bla, và nó định nghĩa một thuộc tính bên ngoài có sẵn của một đối tượng Foo. y tương đương với blablabla=100 và sau đó là x trong foo tương đương với blablabla trong foo của bạn. Đây là một số thực sự thô jsfiddle bạn có thể chạy để xem điều này.

1

Có, bạn hiểu điều đó!
Đối với phần thứ hai của câu hỏi, đó là tất cả về thừa kế, giống như mối quan hệ giữa cửa sổ (chung) và các hàm được định nghĩa trong phạm vi của nó (suy nghĩ gốc). Vì vậy, tất cả mọi thứ bạn không xác định lại, sẽ được nhìn lên tổ tiên.

Đây là một tremendous good video bởi Crockford, người giải thích nó thực sự tốt.

2

Mọi thứ bạn đã nói đều chính xác. (Tất nhiên, một lỗi sẽ được ném tại nhiệm vụ blablabla trong Strict Mode.

Trong hiệp hai, không có gì đặc biệt về chức năng của hàm tạo. . như nó tham chiếu (tuổi thọ của this.getblabla trong trường hợp này)

Hãy ví dụ này:

function initBlaBla() { 
    var blabla = 10; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 

function Foo() { 
    this.bla = 1; 
    blablabla = 100; 
    initBlaBla.call(this); 
} 

foo = new Foo(); 

ở đây, các nhà xây dựng Foo không tạo thành một đóng cửa và phạm vi của nó được phát hành ngay lập tức initBlaBla mặt khác. han d tạo ra một đóng cửa. Thật thú vị, trình biên dịch có thể thấy rằng blabla không bao giờ được viết và tối ưu hóa this.getblabla để luôn trả về 10 và không bao giờ lưu phạm vi đóng. Điều này có thể được nhìn thấy khi bạn phá vỡ thực hiện trong một chức năng bên trong một đóng cửa và cố gắng đọc một giá trị nó không tham chiếu nội bộ.

Phạm vi đóng cửa sẽ được phát hành và xếp hàng đợi để thu gom rác thải nếu bạn gọi bất cứ điều nào sau đây:

delete foo.getblabla; 
foo.getblabla = "Anything!"; 
foo = "Anything else."; 
Các vấn đề liên quan