2016-12-23 16 views
6

enter image description heređóng cửa Recusive trong Javascript

function buildList(list) { 
    var i  = 0; 
    var first = function() { 
    console.log("in") 
    console.log(i); 
    } 
    var Second = function() { 
    console.log("out") 
    first(); 
    } 
    return Second; 
} 

var a = buildList([1, 2, 3]) 
console.dir(a); 

a(); // Here closure is created which has function first ,Here first also has one closure of itself that means recursive closure 

Khi tôi thấy giao diện điều khiển của tôi trong Chrome nó có một kết thúc trong đó có chức năng đầu tiên mà cũng có một kết thúc của chính nó, tức là nó có vòng lặp lặp đi lặp lại của chức năng riêng của mình trong việc đóng cửa, Liệu bất cứ ai biết whats xảy ra ở đây, tôi rất bối rối, Tại sao có infinte đóng vòng lặp

+4

Thật khó để định dạng và thụt lề mã của bạn một cách chính xác? Dù sao, xin vui lòng gửi một ảnh chụp màn hình của màn hình hiển thị devtools đó là khó hiểu bạn. –

+0

Tôi đã thêm một scrrenschot –

+0

bạn chỉ có tài liệu tham khảo trong cả hai hướng, không có vòng lặp. :) –

Trả lời

0

Các công cụ phát triển hiển thị biến là một biến trỏ đến một chức năng vô danh/đóng.

Trong javascript, hàm được xác định trong phạm vi và cũng có thể xác định phạm vi theo khối nội dung của nó. Phạm vi "biết" tất cả các biến bên trong khối xác định và tất cả các biến được xác định bên ngoài hàm nhưng trong phạm vi của phạm vi phạm vi được xác định trong.

Các công cụ hiển thị cho bạn phạm vi hàm trả về (a in trường hợp này). Hàm first được xác định trong phạm vi chức năng a.

Biến số first cũng được biết đến trong phạm vi của hàm ẩn danh mà bạn đã gán cho biến first.

Và những gì bạn nhận được trên màn hình của mình: first là một biến chứa hàm. Trong phạm vi của hàm này, một biến số first được biết là trỏ đến một hàm. Trong phạm vi chức năng này ...

Bạn thấy không?

+0

Nếu bạn nói đầu tiên cũng có phạm vi riêng của nó ,, thì tại sao thứ hai không có phạm vi riêng của nó ,,, ??? nó chỉ có phạm vi đầu tiên và danh sách ?? –

+0

Có, nó có đường nối rằng trình gỡ lỗi chrome chỉ hiển thị các biến trong phạm vi, được sử dụng trong phạm vi này. Xem mã văn bản trong dòng thứ 3 của đầu ra ảnh chụp màn hình của bạn. –

2

A closure là một loại đối tượng đặc biệt kết hợp hai thứ: một hàm và môi trường trong đó chức năng đó được tạo.

  1. Không cần nhầm lẫn, hành vi giống như mong đợi đối với mã này. Đây là những gì xảy ra khi bạn làm console.dir(a); trong mã của bạn, nó trả về hàm Second, tôi nghĩ điều đó rõ ràng cho bạn.

  2. Bây giờ, khi bạn mở rộng chức năng này, nó sẽ hiển thị cho bạn trong Closure chức năng gốc (environment function) của Second, là buildList. Trong bạn mã nó đang làm điều tương tự.

  3. Bây giờ điều tiếp theo là mở rộng này functionbuildList, những gì nó sẽ cho bạn thấy là các đối tượng con của nó, nào là var i = 0;function first. Bảng điều khiển của bạn đang hiển thị như mong đợi.

  4. Bây giờ một lần nữa khi bạn mở first() nó sẽ cho bạn thấy trong Closure chức năng cha mẹ (environment function) của first, đó là buildList. (giống như trong bước 2).

Bây giờ nó lặp lại bước 3 một lần nữa và sau đó bước 4. và như vậy ... Có thể bạn hiểu điều gì đang xảy ra ở đây.

+0

Nhưng tôi không thấy bất kỳ chức năng xây dựng trong đóng cửa của tôi ?? –

+0

@Parshuram, Bạn đang thực thi cùng một mã bạn đã đăng câu hỏi? –

+0

Ya sir nhưng chỉ là danh sách biến, thay vì tôi mà không làm cho bất kỳ sự khác biệt nhìn thấy ảnh chụp màn hình của tôi bây giờ –

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