2013-08-26 5 views
6

मैं एक गेम बनाने की कोशिश कर रहा हूं और मैंने देखा है कि संगठन के लिए कुछ कार्यों को अन्य कार्यों के अंदर रखना बेहतर हो सकता है क्योंकि इन्हें मूल कार्य में विशेष रूप से उपयोग किया जाता है। उदाहरण के लिए:कौन सा जावास्क्रिप्ट फ़ंक्शन प्लेसमेंट बेहतर है?

function fn1() 
{ 
    fn2(); 

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

fn1 कई बार कहा जाता हो जाता है, और fn1 उसके निष्पादन में fn2 कई बार कॉल करेंगे। जब fn1 कहा जाता है, तो क्या fn2 को फिर से संसाधित किया जाना चाहिए (बेहतर शब्द की कमी के लिए) हर बार? क्या मैं इस वजह से प्रदर्शन के मामले में हार रहा हूं? क्या मुझे इसके बजाय fn1 के बाद fn2 रखना चाहिए, इस तरह?

function fn1() 
{ 
    fn2(); 
} 

function fn2() 
{ 
    //Stuff happens here 
} 

उत्तर

2

आप समान scoping प्राप्त करने के लिए, लेकिन केवल fn2 में से एक प्रतिलिपि बनाने के कर सकते हैं:

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

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

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

fiddles के लिए इनमें से सांत्वना उत्पादन की तुलना करें, जिनमें से पूर्व fn2 की एक अतिरिक्त कॉपी बन जाती है , के बाद से एक स्थानीय रूप से scoped fn2 को fn1 प्रत्येक कॉल के लिए बनाई गई है: http://jsfiddle.net/A2UvC/3/ और http://jsfiddle.net/A2UvC/3/

वहाँ additiona के लिए फायदे हैं हालांकि fn2 की एल प्रतियां। वे निम्नलिखित स्थिति में की तरह अलग अलग चर के लिए उपयोग हो सकता है:

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

जब से तुम कोष्टक में समारोह अभिव्यक्ति संलग्न नहीं कर रहे हैं, हो सकता है आप स्पष्ट रूप से कहना है कि आप बाहरी समारोह तुरंत बुला रहे हैं चाहते हैं। प्रासंगिक पढ़ने सामग्री: http://benalman.com/news/2010/11/immediately-invoked-function-expression/। –

+1

@ फ़ेलिक्सक्लिंग मैंने इसे और अधिक स्पष्ट करने के लिए कोष्ठक जोड़ा। – Paulpro

+1

+1 :-) इसके अलावा, क्या आप समझा सकते हैं कि ओपी का पहला तरीका एफएन 2 –

संबंधित मुद्दे