2013-04-16 40 views
15

Tôi đã đọc rất nhiều về các bao đóng trong Javascript Niềng răng đó là gì? Tôi đọc trên mozilla.org mà nói đóng cửa nên được định nghĩa làĐóng cửa Chưa xác định Javascript

(function(){...})();

nhưng trên http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html, nó nói chức năng đóng cửa là

(function(){...}());

sự khác biệt hoặc sau này một là sai là gì? mục đích của() cuối cùng là gì? Bạn sẽ đặt một số thông số bên trong? Tôi đang tìm kiếm một tài liệu tham khảo tốt.

Edit: Hơn nữa, có một ví dụ về Mozilla.org

var makeCounter = function() { 
var privateCounter = 0; 
    function changeBy(val) { 
    privateCounter += val; 
    } 
    return { 
    increment: function() { 
     changeBy(1); 
    }, 
    decrement: function() { 
     changeBy(-1); 
    }, 
    value: function() { 
     return privateCounter; 
    } 
    } 
}; 

lý do tại sao các dấu chấm phẩy là cần thiết cho 'chức năng' này? Nếu nó cần được gọi ngay sau khi khai báo, a() nên được đặt trước dấu chấm phẩy kết thúc. Nhưng không có.

+0

Nó không phải là một kết thúc, nó là một chức năng ẩn danh. – zerkms

+1

Bản sao chính xác của [Sự khác biệt giữa các chức năng ẩn danh tự thực hiện (aka IIFE) thực hiện] là gì (http://stackoverflow.com/questions/16026909/what-is-the-difference-between-those-self-executing -anonymous-function-aka-iife) – zerkms

+1

có thể trùng lặp của [(...()) so với (...)() trong đóng javascript] (http://stackoverflow.com/questions/8774425/vs-in -javascript-closures) – Quentin

Trả lời

17

Cú pháp

(function(){...})() 

chỉ đơn giản là một ngay lập tức gọi chức năng ẩn danh. Không quan trọng bạn sử dụng các dấu ngoặc như thế nào, vì mã cơ bản là một hàm đang được khai báo và được gọi ra.

đóng cửa thay vào đó sử dụng để mô tả một tình huống mà một hàm có quyền truy cập vào các biến khai báo bên ngoài phạm vi của nó, truy cập thông qua đóng cửa

Để rõ ràng:

Nếu chúng ta có chức năng sau

function hello() { 
     alert("Hello"); 
    } 

Chúng tôi có thể gọi hàm theo số

hello() 

Gọi hàm 'hello'. Nhưng nếu chúng ta không muốn để cho nó một cái tên, nhưng vẫn gọi nó, sau đó chúng ta có thể làm

(function hello() { 
    alert("Hello"); 
})() 

nào sẽ làm chính xác giống như các ví dụ trước gọi hello

Tuy nhiên, trong trường hợp này không có điểm nào trong việc đặt tên cho hàm 'hello', vì vậy chúng ta có thể chỉ cần xóa tên đó:

(function() { 
    alert("Hello"); 
})() 

Ký hiệu này được sử dụng trong câu hỏi ban đầu của bạn.

+0

Tôi tin như vậy - tôi đang nói cả hai phương pháp gọi biểu thức hàm đều giống nhau. Và các bao đóng đó khác với các biểu thức hàm được gọi ngay lập tức. Hãy cho tôi biết nếu tôi giải thích sai câu hỏi mặc dù :) – AlanFoster

+0

có tài liệu nào tốt về các dấu ngoặc đơn không? –

+0

@ user1978421 Tôi đã thêm một ví dụ dần dần về điều này cho bạn – AlanFoster

2

Không có sự khác biệt. Bạn cũng có thể làm như vậy:

true && function(){ /* code */ }(); 
0,function(){ /* code */ }(); 

!function(){ /* code */ }(); // Facebook style 
~function(){ /* code */ }(); 
-function(){ /* code */ }(); 
+function(){ /* code */ }(); 

// with new  
new function(){ /* code */ } 
new function(){ /* code */ }() // if you need arguments then use brackets 
+2

Và tại sao lại như vậy? Điều này là tất cả chính xác, nhưng tôi nghi ngờ rằng một người mới bắt đầu JavaScript sẽ hiểu tại sao những công việc này. –

+0

Vì bạn có thể lưu 1 ký tự trong một số trường hợp :) – Ildar

+2

Đó không phải là ý tôi. Ví dụ. tại sao làm '(function() {/ * code * /}());' hoặc '+ function() {/ * code * /}();' làm việc trong khi 'function() {/ * code * /} (); 'hoặc' * function() {/ * code * /}(); 'không? Các đặc điểm của những dòng này cho phép hàm gọi là gì? –

7

Ví dụ của bạn hiển thị Immediately Invoked Function Expression hoặc IIFE.Nó nói với người phiên dịch:

  • đây là một chức năng
  • nó không có tên
  • giữ nó ra khỏi phạm vi toàn cầu tức là 'cửa sổ'
  • gọi nó bây giờ

Có , bạn có thể đặt các tham số bên trong() cuối cùng. Ví dụ:

(
    function(username){ 
     alert("Hello " + username); 
    } 
)("John Smith") 

Closures là một tính năng của javascript cho phép chúng ta thực hiện data hiding đó là tương đương với các biến tư nhân trong các ngôn ngữ như C++ hoặc Java.

function getBmiCalculator(height, weight) { 
    // These are private vars 
    var height = height; 
    var weight = weight; 

    function calculateBmi(){ 
     return weight/(height * height); 
    } 
    return calculateBmi; 
} 

var calc = getBmiCalculator(1.85, 90); 

// calc still has access to the scope where height and weight live. 
var bmi = calc(); 
alert(bmi); 

Trong ví dụ này, chiều cao & không thể thu gom rác cho đến khi calc bị phá hủy. Phần bộ nhớ hoặc "phạm vi" có chiều cao là

0

toán tử nhóm có thể bao quanh mô tả chức năng như không có dấu ngoặc đơn cuộc gọi và cũng bao gồm cả dấu ngoặc đơn gọi. I E. cả hai biểu thức dưới đây là chính xác FE:

 (function() {})(); 
     (function() {}()); 

Function Expression

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