2010-09-23 31 views
21

thể trùng lặp:
Location of parenthesis for auto-executing anonymous JavaScript functions?Có sự khác biệt nào giữa (hàm() {...}()) hay không; và (hàm() {...})() ;?

Đôi khi tôi thấy:

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

và đôi khi tôi thấy:

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

tôi xem cả hai biểu mẫu có và không có đối số. Họ bothexecute chức năng ẩn danh.

Có sự khác biệt giữa hai biểu mẫu không? Có lý do thuyết phục nào để sử dụng một biểu mẫu trên biểu mẫu khác không?

+0

@Tim - Cảm ơn bạn đã chỉ ra chuỗi đó. Tôi không tìm thấy nó với tìm kiếm. –

+0

Chúng ta hãy tiếp tục bỏ phiếu cho một bản sao ... –

+2

Josh: Câu trả lời của CMS tốt hơn so với bất kỳ bản sao nào, vì vậy một số tốt đã đến từ nó. –

Trả lời

32

Không có sự khác biệt thực tế trong hai hình thức, nhưng từ một ngữ pháp điểm chênh lệch giữa hai là The Grouping Operator - ngoặc - sẽ tổ chức trong ví dụ đầu tiên một CallExpression, trong đó bao gồm các FunctionExpression:

 
       CallExpression 
       |   | 
     FunctionExpression | 
       |   | 
       V   V 
    (function() {  }()); 
    ^     ^
    |--PrimaryExpression --| 

Trong ví dụ thứ hai, chúng tôi có đầu tiên một tổng thể CallExpression, chứa FunctionExpression:

 
      PrimaryExpression 
       | 
     FunctionExpression 
       | 
       V 
    (function() {  })(); 
    ^     ^
    |-- CallExpression --| 

5

Không có sự khác biệt giữa hai, cho đến nay là trình biên dịch có liên quan. Tuy nhiên, sẽ thấy rằng phong cách (function() {}()) được đề xuất trong JavaScript code conventions của Douglas Crockford.

+0

Hiệu chỉnh: (function() {}()); – Moses

+1

Như Moses đã viết, có vẻ như đó là một cách khác.Từ văn bản đó: 'Khi một hàm được gọi ngay lập tức, toàn bộ biểu thức lời gọi sẽ được bao bọc trong các dấu ngoặc để cho thấy rõ ràng rằng giá trị được tạo ra là kết quả của hàm và không phải là chính hàm đó.' ...' (function() {...}()); ' –

+3

Để rõ ràng hơn, Crockford không (rõ ràng) đề xuất một trong hai hình thức trong liên kết đó. Điều duy nhất liên quan mà Crockford đề xuất là gói các chức năng tự thực hiện trong các lần parens. – Moses

2

Theo như sự khác biệt, nó thực sự chỉ là cú pháp. Hơi tương đương với: "bạn có thích jQuery() hoặc $()?" Cả hai có thể được biên dịch, thực hiện và được sử dụng thay thế lẫn nhau (AFAIK).

Từ mẫu mã tôi đã thấy vậy, đến nay, nhiều người dường như theo các quy ước mã Crockford:

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

Cá nhân, tôi thích công ước (function(){})(); vì nó là rõ ràng hơn với tôi rằng các chức năng là tự - thực hiện; Tôi cũng là một người dùng lớn của jQuery và đó là quy ước được sử dụng trong nguồn jQuery.

Ngoài ra, nó được coi là thực hành tốt để sử dụng parens để đính kèm chức năng tự thực hiện của bạn, bất kể bạn chọn đi theo biểu mẫu nào.

+0

Có nguồn nào cho "quy ước chiếm ưu thế" không? –

+0

@Casey - Crockford đề cập đến nó trong [** quy ước mã **] của mình (http://javascript.crockford.com/code.html) - [Mozilla] (https://developer.mozilla.org/en/JavaScript_style_guide) và [Drupal] (http://drupal.org/node/172169) các quy ước dường như không đề cập đến nó theo một trong hai cách. –

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