2014-04-09 18 views
5

Đã gặp phải một số mã đang sử dụng IIFE trong biểu thức chứ không chỉ là hàm bình thường.Biểu thức hàm ẩn danh JavaScript vs IIFE

var custom_type = (function() { 
    return $('#myDiv').attr('custom_type'); 
})(); 

Thông thường tôi sẽ viết những dòng này như một cái gì đó như:

var custom_type = function() { 
    return $('#myDiv').attr('custom_type'); 
}; 

là gì lý do IIFE? Điều duy nhất tôi có thể nghĩ là IIFE có thể gán biến số custom_type chỉ một lần khi bắt đầu trong khi thứ hai có thể tiếp tục kiểm tra loại cập nhật mỗi khi biến được tham chiếu.

+0

Người đầu tiên thực hiện chức năng và lưu trữ kết quả của nó, số giây lưu trữ chức năng dưới dạng định nghĩa. – Rolice

+0

Cái đầu tiên tương đương với 'var custom_type = $ ('# myDiv'). Attr ('custom_type')'.Vì vậy, cả hai ví dụ đều có kết quả khác nhau (trong ví dụ đầu tiên, 'custom_type' là một chuỗi, và trong chuỗi thứ hai là hàm) và không có ngữ cảnh, nó không thể cho biết lý do đầu tiên được sử dụng. Có lẽ ai đã viết mã không muốn 'custom_type' là một hàm. –

Trả lời

5

Trong ví dụ này, bạn có thể phân chia với các chức năng hoàn toàn và chỉ cần làm:

var custom_type = $('#myDiv').attr('custom_type'); 

Tuy nhiên nói chung bạn có thể sử dụng một IIFE cho phức tạp hơn "just-in-time" tính toán của các bài tập biến - Tôi thích để sử dụng chúng nếu tôi cần lặp lại thứ gì đó, vì vậy tôi có thể có i mà không gây ô nhiễm phạm vi hiện tại.

Trong ví dụ thứ hai của bạn, tuy nhiên, kết quả là hoàn toàn khác nhau - bạn sẽ cần phải gọi chức năng custom_type() để có được những hiện giá trị, trong khi phần đầu tiên của mã sẽ nhận được giá trị của nó một lần, và biến sẽ giữ giá trị đó.

+0

Tôi đoán đó là câu hỏi hay hơn, tại sao IIFE thay vì gán nó trực tiếp vào giá trị trả về '.attr'. Dường như không phức tạp. – diplosaurus

1

IIFE sẽ thực sự chạy (biểu thức hàm được gọi ngay lập tức), do đó biến sẽ được đặt thành phản hồi của nó.

Dưới đây là một JSFiddle để chứng minh điều này, xem console JS của bạn cho kết quả: http://jsfiddle.net/Y4JmT/1/

Mã đây:

var custom_type = (function() { 
    return 'foo'; 
})(); 

var custom_type2 = function() { 
    return 'bar'; 
}; 

console.log('iife = ' + custom_type); 
console.log('non-iife = ' + custom_type2); 

Trong giao diện điều khiển JS của bạn, bạn sẽ thấy một cái gì đó tương tự như:

iife = foo 

non-iife = function() { 
    return 'bar'; 
} 
2

Đầu tiên của bạn (IIFE) thực hiện chức năng và lưu trữ kết quả của nó, các giây lưu trữ chức năng như định nghĩa.

(function(x) { 
    return x * 2; 
})(5); 

Bạn đang thực hiện cuộc gọi như để funciton bình thường: func (arg1, arg2), nhưng thay vì tên hàm bạn vượt qua toàn bộ định nghĩa hàm, do đó trên sẽ trở như:

function multiply(x) { 
    return x * 2; 
} 

multiply(5); 

Chúng có nghĩa giống nhau, bạn đang thực hiện cuộc gọi. Không chắc chắn, thứ hai là định nghĩa cộng với một cuộc gọi.

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