2010-11-19 34 views
6

Trong ứng dụng web dựa trên jQuery, tôi có nhiều tập lệnh có thể được đưa vào và tôi chỉ sử dụng một trong số chúng cùng một lúc (tôi biết không bao gồm tất cả chúng tốt hơn, nhưng tôi chỉ chịu trách nhiệm cho JS vì vậy đó không phải là quyết định của tôi). Vì vậy, tôi đang gói mỗi tệp trong một hàm initModule() đăng ký nhiều sự kiện khác nhau và thực hiện một số khởi tạo, v.v.Chức năng riêng trong JavaScript

Bây giờ tôi tò mò nếu có bất kỳ sự khác biệt nào giữa hai cách xác định chức năng không làm lộn xộn không gian tên chung:

function initStuff(someArg) { 
    var someVar = 123; 
    var anotherVar = 456; 

    var somePrivateFunc = function() { 
     /* ... */ 
    } 

    var anotherPrivateFunc = function() { 
     /* ... */ 
    } 

    /* do some stuff here */ 
} 

function initStuff(someArg) { 
    var someVar = 123; 
    var anotherVar = 456; 

    function somePrivateFunc() { 
     /* ... */ 
    } 

    function anotherPrivateFunc() { 
     /* ... */ 
    } 

    /* do some stuff here */ 
} 
+0

Hãy xem [câu hỏi này] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

Trả lời

8

sự khác biệt lớn giữa hai cách tiếp cận này nằm trong thực tế KHI chức năng trở nên có sẵn. Trong trường hợp đầu tiên, hàm sẽ có sẵn sau khi khai báo nhưng trong trường hợp thứ hai nó có sẵn trong phạm vi (nó được gọi là cẩu).

function init(){ 
    typeof privateFunc == "undefined"; 
    var privateFunc = function(){} 
    typeof privateFunc == "function"; 
} 

function init(){ 
    typeof privateFunc == "function"; 
    function privateFunc(){} 
    typeof privateFunc == "function"; 
} 

khác hơn thế - về cơ bản chúng giống nhau.

+3

Sự khác biệt duy nhất là không giống như hàm được tạo bởi hàm exprerssion, hàm được tạo bởi khai báo hàm có tên, sẽ hiển thị trong biểu diễn chuỗi của hàm trong một số trình duyệt, bạn có thể trợ giúp khi gỡ lỗi. Tên hàm cũng hiển thị trong thuộc tính 'name' của đối tượng hàm trong một số trình duyệt. –

+0

Tuyên bố hàm đặt thuộc tính tên của hàm nhưng hành vi này không được định nghĩa bởi bất kỳ chuẩn nào, được hỗ trợ kém trong số các trình duyệt khác nhau và do đó không thể dựa vào. Nhưng điểm được thực hiện là chính xác - đây là sự khác biệt giữa tuyên bố hàm và khai báo. – Andris

+0

Để rõ ràng hơn, điều này là do khai báo hàm là "hoisted" (dấu ngoặc kép vì nó phức tạp hơn một chút khi đơn giản di chuyển khai báo) giống như khai báo biến. Khi sử dụng biểu thức hàm chỉ có phần khai báo biến được hoisted. – Matt

0

đây là một mô hình mà đã giúp tôi quản lý module trong javascript:

base.js:

var mod = {}; 

mod.functions = (function(){ 

    var self = this; 

    self.helper1 = function() { 

    } ; 

    self.helper2 = function() { 

    } ; 

    return self; 

}).call({}); 

module_one.js

mod.module_one = (function(){ 

    var 
    //These variables keep the environment if you need to call another function 
    self = this, //public (return) 
    priv = {}; //private function 

    priv.funA = function(){ 
    } 

    self.somePrivateFunc = function(){ 
    priv.funA(); 
    }; 

    self.anotherPrivateFunc = function(){ 

    }; 

    // ini module 

    self.ini = function(){ 

    self.somePrivateFunc(); 
    self.anotherPrivateFunc(); 

    }; 

    // ini/end DOM 

    $(function() { 

    }); 

    return self; // this is only if you need to call the module from the outside 
       // exmple: mod.module_one.somePrivateFunc(), or mod.module_one.ini() 

}).call({}); 
Các vấn đề liên quan