2012-12-12 19 views
5

निम्नलिखित कोड प्रस्तुत किया गया है, Head First jQuery पुस्तक में।वैरिएबल परिभाषित नहीं है, कभी-कभी

function lightning_one(t) { 
$("#lightning1").fadeIn(250).fadeOut(250); 
setTimeout("lightning_one()", t); 
}; // end lightning_one 

इसे इस लाइन के साथ बुलाया जाता है।

lightning_one(3000); 

मनाया व्यवहार,, कि बिजली में fades और बाहर एक बार है 3 सेकंड इंतजार कर रहा है में fades और बाहर फिर से, और फिर अंदर और बाहर फीका करने के लिए जारी है। फायरबग कोई जावास्क्रिप्ट त्रुटियों को दिखाता है।

मुझे समझ में आता है कि मैं देखता हूं कि मैं क्या देखता हूं। मैंने सोचा कि मैं 3 सेकंड अंतराल को संरक्षित करने का प्रयास करेगा, तो मैं इस बदल दिया है:

setTimeout("lightning_one()", t); // nothing in the brackets 
इस के लिए

:

setTimeout("lightning_one(t)", t); // t is in the brackets 

जब मैं पृष्ठ को रीफ्रेश, बिजली में fades और बाहर एक बार। फायरबग मुझे बताता है कि परिवर्तनीय टी अपरिभाषित है।

मेरा सवाल यह है कि, यदि मेरे परिवर्तन के बाद चर टी को परिभाषित नहीं किया गया है, तो मैंने इसे बदलने से पहले त्रुटि के बिना कैसे चलाया? यह अभी भी एक चर नाम टी है।

अधिक जानकारी

आप जो कोई टिप्पणी नहीं और जवाब लिखा धन्यवाद। यदि कोड परिवर्तन पर बाद में सुझाव दिया जाता है

lightning_one(); 

    function lightning_one(){ 
$("#container #lightning1").fadeIn(250).fadeOut(250); 
setTimeout("lightning_one()",4000); 
    }; 

मैं अभी तक लागू अध्याय समाप्त नहीं किया है तो मैं नहीं जानता कि: रिकॉर्ड के लिए, "अंत" फ़ोल्डर में, कोड इस हो जाता है। जैसा कि पहले उल्लेख किया गया है, यह शायद वहां की सबसे अच्छी किताब नहीं हो सकती है। हालांकि यह मैंने खरीदा है और मैं इसे से jQuery के मूलभूत सिद्धांतों को सीख रहा हूं।

+4

वे वास्तव में 'setTimeout' पर एक स्ट्रिंग पास करते हैं? उस पुस्तक को दूर फेंक दो। – Bergi

+0

मैं वही सोच रहा था: मैंने सोचा कि इस तरह के कार्यों का आह्वान करना एक बुरा अभ्यास था ... ऐसा कुछ नहीं जिसे किताब में पढ़ाया जाना चाहिए! – jahroy

+0

मैंने उस प्रभाव को कई शब्दों को देखा जब मैं अपने आप को जवाब खोजने की कोशिश कर रहा था। उद्धरण के बिना समारोह को कॉल करना मेरे असफल प्रयासों में से एक था। हालांकि मेरे प्रश्न के प्रयोजन के लिए, मैंने सोचा कि एक सटीक उद्धरण जाने का सबसे अच्छा तरीका होगा। –

उत्तर

6

क्योंकि एक स्ट्रिंग के रूप setTimeout का पहला तर्क eval एड है, जिसका अर्थ है कि यह समारोह है, जिसमें t परिभाषित नहीं है की बाहरी गुंजाइश की जांच कर रहे होंगे। पहला एक ठीक है क्योंकि आप कॉल में किसी भी चर का उपयोग नहीं करते हैं, लेकिन दूसरा ऐसा नहीं है क्योंकि t फ़ंक्शन के दायरे से बाहर परिभाषित नहीं किया गया है। यह वास्तव में स्थानीय है।

सलाह: eval का उपयोग न करें। वास्तव में, आपको स्ट्रिंग तर्क की आवश्यकता नहीं है। एक समारोह अभिव्यक्ति का उपयोग करें:

setTimeout(function() { 

    lightning_one(t); 

}, t); 
2

यह होगा काम:

setTimeout(function() { lightning_one(t); }, t); 

मैं बहुत यकीन है कि एक स्ट्रिंग से एक समारोह लागू (और दे यह मूल्यांकन किया जाता है) कर रहा हूँ एक बुरा व्यवहार है कि होना चाहिए बचा।

+0

यह उत्तर वास्तव में काम किया था। –

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