2013-07-12 35 views
8

Có một sự khác biệt giữa:Sự khác nhau giữa IIFE và gọi

(function(){ 

}).call(this); 

(function(){ 

})(); 

hoặc

var MODULE = {}; 
(function(){ 
    this.hello = 'world' 
}).call(MODULE); 

var MODULE = {}; 
(function(m){ 
    m.hello = 'world' 
})(MODULE); 

Tôi thường thấy trường hợp đầu tiên trong javascript được biên dịch. Cả hai đều sẽ tạo ra một phạm vi và làm tốt công việc của họ.

Có sự khác biệt nào hay chỉ là vấn đề về hương vị.

Chỉnh sửa: Và tại sao JavaScript được biên dịch sẽ sử dụng cuộc gọi qua IIFE?

+0

Ý anh là gì bởi "javascript biên soạn"? –

+0

như coffescript, hoặc hợp kim cho Titanium –

+0

Nó sẽ thực sự phụ thuộc vào những gì 'this' là tại điểm gọi; trong hầu hết các trường hợp sẽ không có sự khác biệt bởi vì tất cả các mã được bao bọc bởi nó. –

Trả lời

7
(function(){ 

}).call(this); 

gọi hàm vô danh nơi this bên trong hàm sẽ trỏ đến đối tượng được gọi bởi this khi cuộc gọi được thực hiện.

(function(){ 

})(); 

gọi hàm vô danh nơi this bên trong hàm sẽ trỏ đến đối tượng toàn cầu (hoặc không xác định trong chế độ nghiêm ngặt)

Demo: Fiddle

+0

Tại sao hầu hết các cuộc gọi sử dụng javascript được biên dịch thay vì iifee? Nếu tôi tạo ra một chức năng với một cuộc gọi (điều này), điều này sẽ bằng cửa sổ (đối tượng toàn cầu), do đó, nó kinda giống nhau không? –

+0

@JonathandeM. Tôi nghĩ rằng đó là một vấn đề của hương vị hơn là bất kỳ sự khác biệt khác –

+5

Lưu ý rằng ở chế độ nghiêm ngặt, * this * trong ví dụ thứ hai sẽ không được xác định. – RobG

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