2011-10-07 24 views
5

tôi đã chạy một chương trình để thay đổi một số phần của mã javascript của tôi khi nó nghe trộm trong việc kê khai của một var như một chức năng như thế này:Có lợi thế nào để xác định tên hàm trong "var new_function = function name() {};" trong javascript?

var some_function = function name(args){ 
//do stuff 
}; 

Mã bản thân công trình, nhưng tôi đã tự hỏi nếu nó là ok để loại bỏ các "tên" cho tất cả các chức năng mà tôi tìm thấy như thế này (vì nó không phá vỡ nó trong vấn đề khác mà phân tích javascript của tôi) hoặc nếu nó có thể được sử dụng cho nó mà tôi không thể nhìn thấy.

loại bỏ các "tên":

var new_function = function(){/*do stuff*/}; 

Lưu ý: tập tin gốc mà nó lần đầu tiên xảy ra đó là trong jquery-1.6.4.js trong:

jQuerySub.fn.init = function init(selector, context) { 
    if (context && context instanceof jQuery && !(context instanceof jQuerySub)) { 
     context = jQuerySub(context); 
    } 

    return jQuery.fn.init.call(this, selector, context, rootjQuerySub); 
}; 

ty cho bất kỳ sự giúp đỡ trước :)

Trả lời

6

Số nhận dạng name của Biểu thức hàm, chỉ có thể truy cập trong chính hàm đó.

Trong ví dụ jQuery của bạn, mã định danh init thậm chí không được sử dụng, vì vậy tôi nghĩ rằng lợi thế duy nhất để đặt tên cho hàm này chỉ dành cho mục đích gỡ lỗi, trình gỡ lỗi sẽ có thể hiển thị cho bạn tên hàm trong một loạt các cuộc gọi .

Hãy so sánh:

anonymous functions on stack

Vs.

named functions on stack

Nhược điểm tồn tại, một lỗi tồn tại từ lâu trên IE < = 8 làm cho biểu thức hàm có tên để rò rỉ các định danh tên kèm theo của nó phạm vi, hơn nữa, tạo ra hai đối tượng chức năng, ví dụ:

var foo = function bar() {}; 

typeof bar; // "function" on IE 
foo === bar; // false, two different objects 

Để tránh các tác dụng phụ của lỗi này, có một số giải pháp, ví dụ, để làm việc bên trong một hàm được gọi ngay lập tức, để tạo một khai báo hàm trong phạm vi đó và trả về, ví dụ:

jQuerySub.fn.init = (function() { 
    function init(selector, context) { 
    //... 
    } 

    return init; 
})(); 

Và cách tương tự khác, tôi sẽ khuyên bạn nên kiểm tra các bài viết sau:

+0

Một bất lợi là biểu thức hàm có tên sẽ tạo ra hai chức năng trong IE afaik (hoặc một cái gì đó như thế). –

+1

@FelixKling, đã thêm ghi chú về NFE. – CMS

+0

Ty cho câu trả lời của bạn. Tôi cũng đã thử trong firefox 7.0.1 và nó nhận ra tên bên trong chức năng nhưng không ra khỏi nếu. – Seeker

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