2015-04-01 19 views
5

Tôi được thông báo rằng bạn phải luôn khai báo các hàm trong JavaScript. Điều đó có đúng không? Lợi thế của nó là gì?Tại sao luôn khai báo hàm trong JavaScript?

tôi thường gán chức năng cho một biến như vậy:

var foo = function() {}; 

Nhưng cho là điều này là sai, cái gì để làm chồng tracing. Ai đó có thể xin giải thích? Tôi được yêu cầu làm:

var foo = function fooBar() {}; 

Có ý nghĩa gì nếu nó được gán cho một đối tượng?

Hãy nhớ rằng các chức năng này không nằm trong phạm vi toàn cầu cũng như không được tự thực hiện cũng không được sử dụng nhiều lần.

+4

có thể trùng lặp của [var functionName = function() {} với hàm functionNameName() {}] (http://stackoverflow.com/questions/336859/var-functionname-function-vs-function-functionname) –

+1

Có vẻ như câu hỏi của bạn là về gán tên hàm. Có, điều đó giúp ngăn xếp truy tìm để bạn không thấy chỉ là một loạt các mục 'chức năng ẩn danh'. – JAL

+0

@MikeRobinson rằng câu hỏi là nhiều hơn về cẩu. Tôi biết sự khác biệt giữa hai chức năng đó. Vui lòng đọc lại câu hỏi. – DevNoob

Trả lời

3

Trước hết, một lưu ý nhỏ về thuật ngữ: những gì bạn có không phải là tuyên bố chức năng. Đây là một khai báo hàm:

function fooBar() { 
} 

Nó tạo ra một hàm có tên fooBar truy cập thông qua các biến fooBar. Đây là một bài tập liên quan đến một biểu thức hàm có tên: Tên

var foo = function fooBar() { 
}; 

của chức năng vẫn là fooBar, nhưng hàm được chỉ ràng buộc với một biến fooBar bên trong hàm chính nó và không bên ngoài. Thực tế là nó làm cho các chức năng truy cập bên trong phạm vi của nó mà không cần phải đề cập đến một biến trong một phạm vi bên ngoài, tuy nhiên, có nghĩa là có hai lý do để đặt tên cho nó:

  • Đối với khả năng tham khảo chức năng bên trong chính nó bất kể mã trong chức năng bên ngoài!

    này có thể trở lại bất cứ điều gì các chức năng bên ngoài muốn:

    function fooBar() { 
        return fooBar.toString(); 
    } 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "5" 
    

    Đây luôn là phù hợp:

    var fooBar = function fooBar() { 
        return fooBar.toString(); 
    }; 
    
    var baz = fooBar; 
    fooBar = 5; 
    baz(); // "function fooBar() { …" 
    
  • Và vâng, đối với một vết đống chi tiết hơn:

    function trace(func) { 
        try { 
         func(); 
        } catch (error) { 
         console.log(error.stack); 
        } 
    } 
    
    trace(function() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at /home/ryan/test.js:10:18 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:9:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    
    trace(function descriptiveName() { 
        throw new Error("Bad thing"); 
    }); 
    /* 
    Error: Bad thing 
        at descriptiveName (/home/ryan/test.js:14:18) 
        at trace (/home/ryan/test.js:3:16) 
        at Object.<anonymous> (/home/ryan/test.js:13:8) 
        at Module._compile (module.js:410:26) 
        at Object.Module._extensions..js (module.js:428:10) 
        at Module.load (module.js:335:32) 
        at Function.Module._load (module.js:290:12) 
        at Function.Module.runMain (module.js:451:10) 
        at startup (node.js:123:18) 
        at node.js:866:3 
    */ 
    

    (Node.js được mô tả ở đây.) Lưu ý số descriptiveName ở trên cùng của dấu vết ngăn xếp thứ hai . Điều này đặc biệt thuận tiện khi bạn có các hệ thống gọi lại, sự kiện, phương thức không đồng bộ hơi phức tạp trên các đối tượng được truyền xung quanh, v.v.

+0

Bạn cũng có thể đặt tên IIFE để mô tả một khối mã nào. Ví dụ. '(function applyFixIfNeeded() {// fix in here}());' thay vì sử dụng bình luận thích '// Điều này áp dụng một sửa chữa' với mã dưới đây. Tôi thực sự thích tuyên bố các chức năng ở phía dưới và gọi chúng ở đầu cho điều này, nhưng tôi đã sử dụng hình thức đó trong quá khứ. – plalx

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