2013-08-26 75 views
6

Tôi đang cố gắng xây dựng một trò chơi và tôi nhận thấy rằng đối với tổ chức, có thể tốt hơn là đặt một số chức năng bên trong các chức năng khác vì chúng chỉ được sử dụng trong chức năng gốc. Ví dụ:Vị trí chức năng Javascript nào tốt hơn?

function fn1() 
{ 
    fn2(); 

    function fn2() 
    { 
     //Stuff happens here 
    } 
} 

fn1 được gọi nhiều lần, và fn1 sẽ gọi fn2 nhiều lần trong thực hiện của nó. Khi fn1 được gọi, có phải fn2 phải được xử lý lại (vì thiếu từ tốt hơn) mỗi lần? Tôi có bị mất hiệu suất vì điều này không? Tôi có nên đặt fn2 sau fn1 thay thế không, như thế này?

function fn1() 
{ 
    fn2(); 
} 

function fn2() 
{ 
    //Stuff happens here 
} 

Trả lời

2

Bạn có thể làm điều này để đạt được Phạm vi tương tự, nhưng chỉ tạo ra một bản sao của fn2:

//Initiliaze before you call `fn1`: 
var fn1 = (function(){ 

    // This is the function assigned to fn1 
    return function(){ 
     fn2(); 
    } 

    function fn2() 
    { 
     //Stuff happens here 
    } 
})(); 

So sánh giao diện điều khiển đầu ra trong số này để fiddles, cựu trong đó tạo ra một bản sao của fn2 , vì một scoped địa phương fn2 được tạo ra cho mỗi cuộc gọi đến fn1: http://jsfiddle.net/A2UvC/3/http://jsfiddle.net/A2UvC/3/

có lợi thế để các additiona l bản sao của fn2 tuy nhiên. Họ có thể có quyền truy cập vào các biến khác nhau như trong trường hợp sau:

function fn1(x){ 

    // Return an object exposing fn2 to the caller's scope 
    return {fn2: fn2}; 

    // Each call to fn1 creates a new fn2 which has access 
    // to the closured `x` from the call to fn1 that created it 
    function fn2(){ 
     console.log(x); 
    } 

} 

var ex1 = fn1(1); 
var ex2 = fn1(2); 

ex1.fn2 == ex1.fn2; // true 
ex1.fn2 == ex2.fn2; // false, because they are two distinct copies 

ex1.fn2(); // 1 
ex2.fn2(); // 2 
ex2.fn2(); // 2 
ex1.fn2(); // 1 
+0

Vì bạn không kèm theo biểu thức hàm trong dấu ngoặc đơn, có thể bạn muốn chỉ rõ bạn đang gọi hàm ngoài ngay lập tức. Tài liệu đọc có liên quan: http://benalman.com/news/2010/11/immediately-invoked-function-expression/. –

+1

@FelixKling Tôi đã thêm dấu ngoặc đơn để làm rõ hơn. – Paulpro

+1

+1 :-) Ngoài ra, bạn có thể giải thích nếu cách thứ nhất của OP tạo nhiều bản sao của fn2 –

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