2012-04-02 23 views
17

अगर मैं यह परिभाषित करने से पहले नीचे समारोह चलाने के लिए, मैं इस त्रुटि मिल जाएगा ...क्या जावास्क्रिप्ट फ़ंक्शन को कॉल करने से पहले परिभाषित किया जाना चाहिए?

Uncaught ReferenceError: openModal is not defined 

रन तो

$(document).ready(function() { 

    delay(openModal, 2000); 

    delay = function (f, t) { 
     setTimeout(function() { 
      f(); 
     }, t); 
    }; 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

परिभाषित अब अगर मैं समारोह पहली को परिभाषित करने और फिर इसे कहते हैं यह काम करता है ... मेरे पास PHP में पृष्ठभूमि है इसलिए मुझे दुनिया भर में कार्यों तक पहुंचने में सक्षम होने के लिए उपयोग किया जाता है, क्या मैं कुछ गलत कर रहा हूं या क्या सभी कार्यों को इस्तेमाल करने से पहले परिभाषित किया जाना चाहिए?

$(document).ready(function() { 

    delay = function (f, t) { 
     setTimeout(function() { 
      f(); 
     }, t); 
    }; 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

    delay(openModal, 2000); 

}); 
+0

है कि सब कुछ है, यानी आप पहचानकर्ता 'openModal' घोषणा की है कि गुंजाइश ऊपर (के रूप में यह परिभाषित करने के खिलाफ) है? जैसे 'var openModal;' – Rup

+2

संबंधित: http://stackoverflow.com/questions/261599/why-can-i-use-a-function-before-its-defined-in-javascript – TJHeuvel

+0

@Rup यह पहली बार खुला है मॉडल – JasonDavis

उत्तर

32

जब आप एक चर लिए कोई फ़ंक्शन असाइन , फ़ंक्शन तक पहुंचने के लिए आप चर का उपयोग करने से पहले इसे असाइन करना होगा।

आप के बजाय एक चर करने के लिए इसे देने की नियमित रूप से वाक्य रचना के साथ समारोह की घोषणा करते हैं, यह जब कोड पार्स किया गया है परिभाषित किया गया है, तो यह काम करता है:

$(document).ready(function() { 

    delay(openModal, 2000); 

    function openModal() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

(, दायरे में अंतर नोट हालांकि जब आप। वैरिएबल openModal को इसका उपयोग करके स्पष्ट रूप से बनाएं, यह वैश्विक दायरे में बनाया जाएगा और सभी कोड के लिए उपलब्ध होगा। जब आप किसी अन्य फ़ंक्शन के अंदर फ़ंक्शन घोषित करते हैं, तो यह केवल उस फ़ंक्शन के अंदर उपलब्ध होगा। हालांकि, आप इसे बना सकते हैं var openModal = function() { का उपयोग करके, फ़ंक्शन में भी परिवर्तनीय स्थानीय।)

6

दस्तावेज़ के बाहर फ़ंक्शन परिभाषा को स्थानांतरित करें। पहले से ब्लॉक, और चीजें आपके काम की अपेक्षा करेगी। जावास्क्रिप्ट में (अधिकांश भाषाओं में), आपको इसका संदर्भ देने से पहले एक फ़ंक्शन या चर परिभाषित करना होगा।

अपने पहले उदाहरण में, आप पर delay() पर कॉल में संदर्भित करते हैं, लेकिन जावास्क्रिप्ट को यह जानने का कोई तरीका नहीं है कि openModal अभी तक क्या है।

openModal = function() { 
    $('#modal-box').css({ 
     left: $(window).width()/2 - $('#modal-box').width()/2, 
     top: $(window).height()/2 - $('#modal-box').height()/2 
    }); 
    $('#modal-box').show(); 
    $('#modal-mask').show(); 
}; 

$(document).ready(function() { 
    delay(openModal, 2000); 
}); 

संपादित करें:

TJHeuvel बताते हैं कि function से पहले कुछ और एक ही ब्लॉक में निष्पादित किया जाता है कार्यों को परिभाषित करने के लिए कुछ प्रवंचना करता है: Why can I use a function before it's defined in Javascript?

+4

का उपयोग किया गया है बाहर समारोह को परिभाषित करने का क्या मतलब है? * "आपको इसका संदर्भ देने से पहले एक फ़ंक्शन [...] को परिभाषित करना होगा" *: जरूरी नहीं। चूंकि फ़ंक्शन * घोषणाएं * फंसे हुए हैं, आप उन्हें कहीं भी परिभाषित कर सकते हैं और वर्तमान दायरे में अन्य कोड इसे कॉल कर सकते हैं। केवल कार्य * अभिव्यक्ति * को असाइन किए जाने के बाद बुलाया जा सकता है। –

+0

ध्यान दें कि जब आप एक चर को फ़ंक्शन निर्दिष्ट करते हैं तो TJHeuvel बताता है कि लागू नहीं होता है। भले ही फ़ंक्शन ऑब्जेक्ट स्वयं बनाया गया हो, जब कोड पार्स किया जाता है, यह चर के समय चर को आवंटित किया जाता है। – Guffa

-1

शोर में टी हाँ आप एक समारोह उपयोग करने से पहले इसे परिभाषित करने की क्या ज़रूरत है, लेकिन आप जो exectute करने के लिए कोड के रूप में एक स्ट्रिंग लेता है अपने देरी के लिए setTimeout सुविधा का उपयोग कर सकते:

$(document).ready(function() { 

    setTimeOut('openModal()', 2000); 

    openModal = function() { 
     $('#modal-box').css({ 
      left: $(window).width()/2 - $('#modal-box').width()/2, 
      top: $(window).height()/2 - $('#modal-box').height()/2 
     }); 
     $('#modal-box').show(); 
     $('#modal-mask').show(); 
    }; 

}); 

इस काम करेगा के रूप में कार्य जब तक नहीं बुलाया जाता है इसे परिभाषित करने के बाद।

+2

आपका पहला सुझाव काम नहीं करता है, क्योंकि फिलहाल आप 'देरी (ओपनमोडाल, 2000)' कहते हैं, 'ओपनमोडाल' अभी भी खाली फ़ंक्शन का संदर्भ रख रहा है। वास्तविक कार्य केवल बाद में असाइन किया जाता है, लेकिन यह आपके द्वारा पहले से पारित मूल्य को प्रभावित नहीं करता है। आपका दूसरा सुझाव केवल "गलती से" काम करता है। चूंकि 'ओपनमोडाल' को 'var' के साथ घोषित नहीं किया गया है, यह वैश्विक है। लेकिन जैसे ही आप इसे 'var' के साथ ठीक से घोषित करते हैं, यह अब और काम नहीं करेगा, क्योंकि' सेटटाइमआउट 'वैश्विक दायरे में स्ट्रिंग का मूल्यांकन करता है (और' ओपनमोडाल 'तैयार ईवेंट हैंडलर के लिए स्थानीय होगा)। –

+0

ठीक है धन्यवाद। संपादित – Richard

1

मैं कहूंगा, हाँ। कॉल करने से पहले एक फ़ंक्शन को हमेशा परिभाषित किया जाना चाहिए। लेकिन कुछ कार्यों लागू किया जा सकता है (कहा जाता है) जहां इससे पहले कि वे परिभाषित किया गया है (उत्थापन) कार्यों का

दो अलग अलग प्रकार है कि मैं के बारे में लिखना चाहते हैं:

अभिव्यक्ति कार्य & मंदी कार्य

1 - अभिव्यक्ति कार्य: एक फ़ंक्शन अभिव्यक्ति को एक चर में संग्रहीत किया जा सकता है, इसलिए उन्हें फ़ंक्शन नामों की आवश्यकता नहीं है। उन्हें एक अनाम फ़ंक्शन (नाम के बिना फ़ंक्शन) के रूप में भी नामित किया जाएगा।आह्वान करने के लिए (बुलाया जाता है) उन्हें हमेशा एक परिवर्तनीय नाम का उपयोग करने की आवश्यकता होती है। इस प्रकार के फ़ंक्शंस काम नहीं करेंगे अगर इसे परिभाषित किया गया है, जिसका मतलब है कि होस्टिंग यहां नहीं हो रहा है। हमें हमेशा पहले अभिव्यक्ति फ़ंक्शन को परिभाषित करना होगा और फिर उसे आमंत्रित करना होगा।

let lastName = function (family) { 
console.log("My last name is " + family); 
};   
let x = lastName("Lopez"); 

इस तरह आप ES6 में लिख सकते हैं:

lastName = (family) => console.log("My last name is " + family); 
x = lastName("Lopez"); 

2- मंदी कार्य: कार्य निम्न सिंटैक्स के साथ की घोषणा की जाती तुरंत क्रियान्वित नहीं कर रहे हैं। वे "बाद के उपयोग के लिए सहेजे गए" हैं, और बाद में निष्पादित किए जाएंगे, जब उन्हें बुलाया जाता है (जिसे बुलाया जाता है)। यदि आप उन्हें पहले से कॉल करते हैं या उन्हें परिभाषित करने के बाद कहें तो फ़ंक्शन काम करते हैं। यदि आप इसे परिभाषित करने से पहले एक मंदी समारोह कहते हैं - होस्टिंग - ठीक से काम करता है।

function Name(name) { 
    console.log("My cat's name is " + name); 
} 
Name("Chloe"); 

उत्थापन उदाहरण:

Name("Chloe"); 
function Name(name) { 
    console.log("My cat's name is " + name); 
} 
संबंधित मुद्दे

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