जावास्क्रिप्ट नेस्टेड फ़ंक्शन


96

मुझे जावास्क्रिप्ट के लिए कोड का एक टुकड़ा मिला जो मुझे समझ में नहीं आया:

function dmy(d) {
    function pad2(n) {
        return (n < 10) ? '0' + n : n;
    }

    return pad2(d.getUTCDate()) + '/' +
       pad2(d.getUTCMonth() + 1) + '/' +
       d.getUTCFullYear();
}

function outerFunc(base) {
    var punc = "!";

    //inner function
    function returnString(ext) {
       return base + ext + punc;
    }

    return returnString;
}

किसी फ़ंक्शन को किसी अन्य फ़ंक्शन के भीतर कैसे परिभाषित किया जा सकता है? क्या हम मेरे () फ़ंक्शन के बाहर से pad2 () कॉल कर सकते हैं?

कृपया इस पर कुछ प्रकाश डालें। धन्यवाद


13
कार्यों को कार्यों के अंदर बनाया जा सकता है। यह पूरी तरह से वैध है।
0x499602D2

जवाबों:


140

फ़ंक्शंस जावास्क्रिप्ट में एक और प्रकार का चर है (पाठ्यक्रम की कुछ बारीकियों के साथ)। किसी अन्य फ़ंक्शन के भीतर एक फ़ंक्शन बनाने से फ़ंक्शन का दायरा उसी तरह बदल जाता है, जैसे वह किसी वैरिएबल के दायरे को बदल देगा। कुल वैश्विक नाम स्थान प्रदूषण को कम करने के लिए क्लोजर के साथ उपयोग के लिए यह विशेष रूप से महत्वपूर्ण है।

किसी अन्य फ़ंक्शन के भीतर परिभाषित फ़ंक्शन फ़ंक्शन के बाहर पहुंच योग्य नहीं होंगे, जब तक कि वे फ़ंक्शन के बाहर पहुंच योग्य ऑब्जेक्ट से संलग्न न हों:

function foo(doBar)
{
  function bar()
  {
    console.log( 'bar' );
  }

  function baz()
  {
    console.log( 'baz' );
  }

  window.baz = baz;
  if ( doBar ) bar();
}

इस उदाहरण में, बज़ फ़ंक्शन fooको चलाने के बाद उपयोग के लिए उपलब्ध होगा , क्योंकि यह ओवरराइड है window.baz। बार फ़ंक्शन फ़ंक्शन के भीतर निहित स्कोप के अलावा किसी भी संदर्भ में उपलब्ध नहीं होगा foo

एक अलग उदाहरण के रूप में:

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}

Fizzसमारोह एक निर्माता है, ताकि जब चलाने के लिए, यह एक प्रदान करती है के रूप में बनाया गया है buzzसमारोह नव निर्मित वस्तु है।


Window.baz = baz क्या है? यह लाइन m? Ke baz क्यों उपलब्ध है?
ज़ियांग झांग

@ZiyangZhang, उस कोड ब्लॉक के बाद का पैराग्राफ स्पष्टीकरण है, क्या कोई विशेष हिस्सा था जो अस्पष्ट है?
zzzzBov

35

इसे क्लोजर कहा जाता है ।

मूल रूप से, अन्य फ़ंक्शन के भीतर परिभाषित फ़ंक्शन केवल इस फ़ंक्शन के भीतर पहुंच योग्य है। लेकिन परिणाम के रूप में पारित किया जा सकता है और फिर इस परिणाम को बुलाया जा सकता है।

यह एक बहुत शक्तिशाली विशेषता है। आप यहां अधिक स्पष्टीकरण देख सकते हैं:

javascript_closures_for_dummies.html Archive.org पर दर्पण


13
function x() {}

के बराबर (या बहुत समान) है

var x = function() {}

जब तक मैं गलत नहीं हूँ।

तो कुछ अजीब नहीं चल रहा है।


8
पहले वाक्यविन्यास को दस्तावेज़ की शुरुआत में ले जाया जाएगा। इसलिए फंक्शन आरंभ होने से पहले फंक्शन 'x' को कॉल करना संभव है।
टॉम

10
पहला सिंटैक्स आपको नामित कार्यों के साथ बहुत अच्छे स्टैक के निशान भी मिलेगा, दूसरा आपको सिरदर्द देगा
TheZ

@ मुझे लगता है कि क्रोम ने डिबगिंग के लिए हाल ही में फंक्शन नाम जोड़ा है ताकि आपको आम मामले में पहले जैसा सिरदर्द न हो।
जिंगलेष्टुला

@jinglesthula हाँ! क्रोम ने थोड़ी देर पहले इस नाम को जोड़ा और इसे बहुत सराहा गया :)
TheZ

10

फ़ंक्शन-तात्कालिकता को कार्यों के अंदर और बाहर अनुमति दी जाती है। उन कार्यों के अंदर, चर की तरह, नेस्टेड फ़ंक्शन स्थानीय हैं और इसलिए उन्हें बाहरी दायरे से प्राप्त नहीं किया जा सकता है।

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}

foobarखुद के भीतर हेरफेर । barजब तक इसे बाहरी दायरे में परिभाषित नहीं किया जाता है तब तक इसे बाहरी दायरे से नहीं छुआ जा सकता है।

तो यह काम नहीं करेगा:

function foo() {
    function bar() {
        return 1;
    }
}

bar(); // throws error: bar is not defined

4

जब आप किसी फ़ंक्शन के भीतर किसी फ़ंक्शन की घोषणा करते हैं, तो आंतरिक फ़ंक्शन केवल उस दायरे में उपलब्ध होते हैं जिसमें उन्हें घोषित किया जाता है, या आपके मामले में, pad2केवल कॉल किया जा सकता हैdmy कार्यक्षेत्र है।

मौजूदा सभी चर अंदर dmyदिखाई दे रहे हैं pad2, लेकिन यह दूसरे तरीके से नहीं होता है: डी


2

यह जावास्क्रिप्ट (और कई भाषाओं में) पूरी तरह से सामान्य है कार्यों के अंदर कार्य करने के लिए।

भाषा सीखने के लिए समय निकालें, इसे इस आधार पर उपयोग न करें कि यह उसी तरह है जैसा आप पहले से जानते हैं। मैं सुझाव देता हूं कि जावास्क्रिप्ट पर YUI प्रस्तुतियों की डगलस क्रॉकफोर्ड श्रृंखला को देखें, अधिनियम III पर विशेष ध्यान दें : अंतिम कार्य (वीडियो डाउनलोड, स्लाइड और ट्रांसक्रिप्ट के लिए लिंक)


0

function foo() {
  function bar() {
    return 1;
  }
}
bar();

एक त्रुटि फेंक देंगे। चूंकि barअंदर परिभाषित किया गया है foo, barकेवल अंदर ही सुलभ होगा foo
उपयोग करने के लिए barआपको इसे अंदर चलाने की आवश्यकता है foo

function foo() {
  function bar() {
    return 1;
  }
  bar();
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.