2012-06-21 67 views
10

Tôi đã thấy mã Javascript sử dụng dấu ngoặc đơn ngay lập tức sau khi đóng dấu ngoặc nhọn của hàm, tôi không thể hiểu những gì chúng được sử dụng.Dấu ngoặc đơn sau dấu ngoặc nhọn có nghĩa là gì?

Ví dụ:

function foo(bar){ 
    return bar; 
}(0); 
  • không (0) làm gì?

  • Điều này được gọi là gì?

  • Khi nào bạn nên sử dụng kỹ thuật này?

+2

Nếu bạn chỉ cung cấp một ví dụ xấu, sau đó câu hỏi của bạn là bản sao của (http [làm ngoặc xung quanh một đối tượng JavaScript/chức năng khai/lớp có ý nghĩa gì?]: //stackoverflow.com/questions/440739/what-do-parentheses-surrounding-a-javascript-object-function-class-declaration-m). –

Trả lời

9

Trong ví dụ của bạn, bạn chỉ cần có hai câu lệnh và nó tương đương với:

function foo(bar){ 
    return bar; 
} 
0; 

Đây là không chức năng tự gọi. Câu lệnh đầu tiên là khai báo hàm , câu lệnh thứ hai chỉ đơn giản là số 0 bằng chữ, mà không làm gì cả. Dấu ngoặc đơn không thực thi hàm, chúng là grouping operator.

Làm cách nào để chúng tôi có thể chứng minh điều này? Hãy thử:

function foo(bar){ 
    return "bar"; 
}(0); 

và cho tôi biết đầu ra là gì.


Nó sẽ là một chức năng tự gọi, nếu chúng ta có một biểu chức năng. Để làm điều đó bạn có thể sử dụng toán tử nhóm để buộc nó được đánh giá là biểu thức.

Ví dụ:

(function foo(bar){ 
    return bar; 
})(0); 

Đây là một biểu hiện chức năng đặt tên. Kết quả của biểu thức ((function ....)) là tham chiếu hàm và (0) thực thi hàm, chuyển 0 làm đối số.

Vị trí của dấu ngoặc đơn cũng có thể là:

(function foo(bar){ 
    return bar; 
}(0)); 

Có lẽ đây là những gì bạn đã thấy.

Kỹ thuật này đã được rộng rãi thảo luận ở đây: What is the purpose of a self executing function in javascript?

+0

Cảm ơn Felix, bạn phải có đôi mắt đại bàng :) – jon

11

Họ ngay lập tức gọi hàm tương tự như khi bạn gọi một hàm:

function foo() { 
    alert('hello'); 
} 

foo(); // call 

Bạn cũng có thể gọi nó là trực tiếp:

(function foo(){ 
    alert('hello'); 
})(); // <-------------- 

Hiện nay bạn có Function Declaration . Để thực sự tự gọi nó, bạn cần phải có nó như thế này trong ngoặc (để làm cho nó một biểu thức):

(function foo(bar){ 
    return bar; 
})(0); 

Và bây giờ nó là Function Expression và sẽ gọi ngay lập tức. Để biết sự khác biệt giữa Function DeclarationFunction Expression, kiểm tra bài viết tuyệt vời này bằng cách Kangax:


không (0) làm gì?

Đối số được chuyển đến hàm foo do đó bar sẽ là 0 bên trong hàm.

Điều này được gọi là gì?

Đây là chức năng tự inovking hoặc tự thực hiện. Bạn cũng có thể muốn xem this.

Khi nào bạn nên sử dụng kỹ thuật này?

Khi bạn muốn gọi hàm ngay lập tức và chỉ giữ phạm vi biến bên trong biểu thức chức năng đó. Nó sẽ không có sẵn cho thế giới bên ngoài hay đúng hơn là mã bên ngoài biểu thức hàm đó.


Learn More:

+0

Mẹo: '(hàm (...) {...}) (...);' hoạt động mọi lúc, ngay cả với các hàm ẩn danh, trong đó giá trị trả về không được gán cho một var –

+0

Điều này không đúng . Xem câu trả lời của tôi. Nhưng có lẽ OP chỉ đưa ra một ví dụ xấu. –

+0

@FelixKling: +1 cho bạn. Tôi bỏ qua cú pháp của OP, thêm chi tiết. – Sarfraz

0

Đây là một chức năng tự cách gọi. Bạn chuyển 0 làm tham số. Vì vậy chức năng của bạn sẽ được quay trở lại quầy bar bằng 0.

Đối với ví dụ như chức năng dưới đây là tương đương:

function foo(bar) { 
    return bar; 
} 

foo(0); // returns 0 
Các vấn đề liên quan