2009-06-28 13 views
57

कार्य आने के रूप में अपरिभाषित अगर मैं उन्हें document.ready में जगह() फ़ंक्शन:मैं jQuery के दस्तावेज़ में कार्यों को परिभाषित क्यों नहीं कर सकता। पहले से ही?

$(document).ready(function(){ 
    function foo() 
    { 
    alert('Bar'); 
    } 
}); 

foo(); // Undefined 

इस क्यों होता है? मुझे यकीन है कि मुझे बस कुछ सरल समझ की आवश्यकता है :)

उत्तर

60

सुनिश्चित नहीं हैं कि आप के लिए महत्वपूर्ण है, लेकिन आप सामने foo की घोषणा के द्वारा यह काम कर सकते हैं: इनलाइन से

<html><head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script> 
<script> 
var foo;       // Here's the difference 
$(document).ready(function(){ 
    foo = function() 
    { 
    alert('Bar'); 
    } 
}); 
</script></head><body> 
<input type="button" onclick="foo()" value="Click me"> 
</body></html> 

जाहिर है आप कॉल नहीं कर सकते foo()ready() के तुरंत बाद स्क्रिप्ट क्योंकि ready() कोड अभी तक नहीं चला है, लेकिन आप बाद में फ़ंक्शन को कॉल कर सकते हैं।

बस सुनिश्चित करें कि कुछ भी नहीं कहते हैं foo() से पहले ready() कोड समाप्त हो गया है (या foo() एक हानिरहित समारोह के प्रारंभिक घोषणा कर) की कोशिश कर सकते हैं।

+0

ग्रेट विचार। धन्यवाद रिची! –

+0

क्या होगा यदि आपको कुछ पैरामीटर के साथ 'foo() 'को कॉल करने की आवश्यकता है?आप उन्हें कैसे पारित करेंगे, और उन्हें कैसे प्राप्त किया जाएगा? –

+1

@ alonso.torres: बस किसी भी अन्य जावास्क्रिप्ट फ़ंक्शन की तरह: 'foo = function (x, y, z) {...} '...' onclick =" foo (1, 2, 3) "' – RichieHindle

24

आप कर सकते हैं लेकिन उन्हें ready() विधि के दायरे में बुलाया जाना चाहिए अन्यथा वे ready() विधि से बाहर निकलने पर स्कोप खो देते हैं।

उदाहरण के लिए, नीचे दिए गए कोड काम करेगा:

$(document).ready(function(){ 
    function foo() 
    { 
    alert('Bar'); 
    } 

    foo(); // still in the scope of the ready method 
}); 
+1

क्या इसके आसपास जाने का कोई तरीका है? दायरा बदलो? –

+8

सरल। उन्हें पहले से ही (...) गुंजाइश के बाहर परिभाषित करें। मैं नहीं देखता कि आप ऐसा करने के लिए इतने जुड़े क्यों हैं। यह संभवतः आपको क्या लाभ दे सकता है? – Oli

+0

@ ओली, यह कोड संगठन दृष्टिकोण से बेहतर होगा। इसे पहले से ही() स्कोप में घोषित करने में सक्षम होना चाहिए। –

4

आपका समारोह $(document).ready() कॉलबैक के दायरे के भीतर परिभाषित किया गया है और नहीं किया जा सकता बाहर से देखा। या तो $(document).ready() के बाहर फ़ंक्शन को केवल कॉल के कॉल के बाहर परिभाषित करें। क्यों ready() के दायरे में साथ समारोह को परिभाषित करने

5

यदि आप उन्हें किसी भी दायरे में डालते हैं तो वे अपरिभाषित नहीं होंगे। यदि आप वास्तव में उन्हें $ (दस्तावेज़) के दायरे से बाहर का उपयोग करना चाहते हैं। पहले से ही ...() तो आपको उन्हें बाहरी रूप से घोषित करने की आवश्यकता है। जैसे:

var foo; 

$(document).ready(function(){ 
    foo = function() 
    { 
    alert('Bar'); 
    } 
}); 

foo(); // works now because it is in scope 

आशा है कि इससे मदद मिलती है।

+0

फिर हरि ओम समाधान क्यों काम करता है? –

+0

@jj_ हरि ओम का समाधान काम करता है क्योंकि myfnc को कॉल उसी दायरे में है जो myfnc में घोषित किया गया है। – Nishan

+0

हाँ 'myfnc() 'कॉल है, लेकिन इनपुट में' myfnc (param1, param2) 'के बारे में क्या है घटना पर क्लिक करें? –

1
<script> 
    $(document).ready(function(){ 
     myfnc = function (param1, param2) 
     { 
     alert('Hello'); 
     } 
     myfnc(); 
    }); 
</script> 
<input type="button" onclick="myfnc('arg1', 'arg2')" value="Click me"> 
0

बस एक और इसके अलावा:

जब कार्य या चर घोषित करने $(document).ready() समारोह के अंदर, इन दुर्गम जब दस्तावेज़ में onclick() बांध का उपयोग कर रहे हैं।

आप या तो $(document).ready() के बाहर अपनी घोषणाओं को स्थानांतरित कर सकते हैं, या आप `$ (दस्तावेज़) .ready() के भीतर $('#element').on('click', function() {}) का उपयोग कर सकते हैं।

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

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