2012-12-23 75 views
5

thể trùng lặp:
Difference between (function(){})(); and function(){}();
Are “(function () { }) ()” and “(function () { } ())” functionally equal in JavaScript?JavaScript chức năng tự gọi

Tôi chỉ tự hỏi liệu có sự khác biệt (liên quan đến các chức năng) giữa hai ví dụ này:

1st

(function foo() { 
console.log("bar") 
})() 
(function foo() { 
console.log("bar") 
}()) 

Cả hai dường như làm việc tốt ...

Cảm ơn!

+2

Không có sự khác biệt nào cả. – Dogbert

Trả lời

4

Chúng giống hệt nhau. Không có sự khác biệt nào giữa hai yếu tố về hiệu quả, đầu ra, hoặc sử dụng. Sử dụng một trong hai là một vấn đề ưu tiên.

Mặc dù có một biến thể ngắn hơn của hai biểu mẫu thường được các minfiers JS sử dụng. Tức là, hợp lý NOT -ing biểu thức hàm và gọi nó:

!function() { 
    console.log(x); 
}();​ 
+0

Ok, cảm ơn! :) – LSFR77

10

Không có sự khác biệt. Thực tế, bạn chỉ cần sử dụng () chỉ vì đồng bằng ...

function() { console.log('bar'); }(); 

... sẽ không được trình phân tích cú pháp JS nhận diện đúng cách. Như đã nói trong ES5 standard:

Ngoài ra, một ExpressionStatement không thể bắt đầu với chức năng khóa vì đó có thể làm cho nó rõ ràng với một FunctionDeclaration.

Giải pháp thay thế (cho (...)) đang làm tăng thêm tuyên bố này với một số toán tử đơn nhất. Cả hai ...

+function() { console.log('bar'); }(); 

... và ...

!function() { console.log('bar'); }(); 

... sẽ làm việc.

+0

Cảm ơn câu trả lời của bạn! – LSFR77

2

Không có sự khác biệt giữa chúng. Cả hai đều là immediately invoked function expressions. Một số người như Douglas Crockford thích second method. Một số thích đầu tiên. Điều thú vị của Crockford là JSLint không cho phép phương pháp đầu tiên, vì vậy tôi cho rằng phương pháp thứ hai phổ biến hơn.

Ồ, và nếu bạn sử dụng khai báo hàm thay vì biểu thức hàm thì bạn có thể gọi hàm trước khi nó xuất hiện trong chương trình.Điều này là do khai báo được kéo lên trong JavaScript:

greet(); // This will work 

function greet() { 
    alert("Merry Christmas!"); 
} 

Điều này cũng không đúng sự thật cho các biểu thức chức năng:

greet(); // This will not work 

var greet = function greet() { 
    alert("Merry Christmas!"); 
}; 

Đó là khá nhiều tất cả các bạn cần biết để bây giờ.

+0

'function greet()', mặc dù hợp lệ, không có ý nghĩa. Chỉ cần 'var greet = function()' là tất cả những gì cần thiết. – ErikE

+0

@ErikE - Không có ý nghĩa như trong? Nó làm cho cảm giác hoàn hảo với tôi. –

+0

Điểm của tên không thể sử dụng là gì? Nó có ý nghĩa nhiều như 'function() {var greet; } 'nếu lời chào không bao giờ được sử dụng. – ErikE

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