2015-11-20 15 views
5

phép nói rằng chúng tôi đã xác định function này trong phạm vi toàn cầu:mảnh cuối cùng của việc đóng cửa javascript tôi stil không hiểu

function createCounter() { 
    var counter = 0; 

    function increment() { 
    counter = counter + 1; 

    console.log("Number of events: " + counter); 
    } 

    return increment; 
} 

Trong hầu hết các ví dụ giải thích đóng cửa tôi thấy thực hiện:

createCounter(); 

từ phạm vi toàn cầu sẽ chỉ trả lại hàm bên trong:

function increment() { 
    counter = counter + 1; 

    console.log("Number of events: " + counter); 
} 

Bây giờ tạo nên tổng số cảm giác e, vì dòng này trong tờ khai createCounter chức năng

return increment; 

Vì vậy, câu hỏi của tôi là, tại sao điều này:

var counter1 = createCounter(); 

counter1(); 

Number of events: 1 //result 

Cuối cùng có được những chức năng để làm việc?

Về cơ bản không phải là counter1createCounter cả hai con trỏ đến chức năng bên trong đó tồn tại trong phạm vi toàn cầu?

Có thể cách tốt hơn để hỏi đây là lý do tại sao counter1() hoạt động và không chỉ trả về hàm bên trong như createCounter?

+1

* "Về cơ bản không phải là 'counter1' và' createCounter' cả con trỏ vào đó chức năng bên trong" * số 'counter1' đề cập đến' increment function() 'rõ ràng là một hàm khác với' hàm createCounter() '. Bạn có thể dễ dàng xác minh điều này bằng cách so sánh chúng: 'counter1 === createCounter' là' false'. Đặt một cách khác: 'createCounter' trả về một hàm mới/khác, nó không trả về chính nó. –

Trả lời

3

Không, createCounter là hàm trả về một phiên bản riêng biệt của hàm increment đang nắm giữ một kết thúc mới với biến số counter cục bộ khác.

Vì vậy, có, bạn cần cuộc gọi bổ sung để có được phiên bản riêng biệt của hàm và gọi bao nhiêu lần tùy thích. Lưu ý rằng việc gọi createCounter không làm tăng bộ đếm, nhưng việc gọi counter1 hoặc counter2 đã làm tăng nó.

var counter1 = createCounter(); //local counter is still 0 
var counter2 = createCounter(); 
counter1(); // 1 
counter2(); // 1 
counter1(); // 2 
counter2(); // 2 
2

createCounter() trả về cho bạn chức năng mà không cần gọi.

Bạn cũng có thể thực hiện createCounter()() để gọi nó mà không cần biến trung gian.

Nếu bạn cũng có giao diện điều khiển đầu ra trong các chức năng bên ngoài, như thế này, nó sẽ được rõ ràng hơn những gì đang xảy ra:

function createCounter() { 
    console.log("in createCounter"); 

    var counter = 0; 

    function increment() { 
     counter = counter + 1; 

     console.log("Number of events: " + counter); 
    } 

    return increment; 
} 

Khi bạn gọi createCounter() và lưu kết quả trong một biến bạn nhận được đầu ra "trong createCounter "nhưng KHÔNG" Số sự kiện ". Khi bạn gọi hàm được lưu trữ trong biến, bạn sẽ nhận được "Số sự kiện: 1" nhưng KHÔNG "trong createCounter".

1
  1. Trong chức năng JS là objects loại Function.
  2. createCounter có phạm vi toàn cầu nhưng increment thì không.
  3. Khi bạn gọi hàm createCounter(), hàm trả về một hàm tồn tại trong bộ đếm 'createCounter function scope and there is another variable` trong phạm vi đó.

  4. Vì vậy, khi bạn gọi hàm trả lại bạn đặt tên là counter1 như counter1(), nó được gọi là sau đó tăng bộ đếm và ghi lại kết quả.

1

Nếu bạn làm console.log(counter1) nó sẽ in chức năng vì nó chỉ là con trỏ hàm.

Khi làm counter1(), bạn là cách gọi chức năng tự

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