2009-10-30 11 views
5

क्या कोई है जो जावास्क्रिप्ट (jquery) फ़ंक्शन को नष्ट करने के बारे में जानता है? मैं jquery "selectable" का उपयोग कर रहा हूं और एक फंक्शन कॉल "एडिट" को चुनने योग्य "स्टॉप" ईवेंट पर निकाल दिया गया है।जावास्क्रिप्ट (jquery) में एक फ़ंक्शन को नष्ट करें

इस "संपादन" फ़ंक्शन के अंदर मैंने कई "क्लिक" ईवेंट के साथ नेस्टेड स्विच फ़ंक्शंस किया है और मेरे पास प्रत्येक "क्लिक" ईवेंट के भीतर कई फ़ंक्शन हैं। मेरी समस्या है, हर बार जब मैं "चयन योग्य" फ़ंक्शन को आग लगाता हूं और फ़ंक्शन "संपादन" के अंदर की घटनाओं को फिर से निकाल दिया जाता है लेकिन पिछले कार्य और घटनाएं अभी भी मौजूद हैं। अब मैं क्या करूँगा चुनिंदा "स्टार्ट" पर भी "संपादन" समारोह में हर घटना को अनइंड करना है।

क्या यह एक स्मृति रिसाव समस्या है? और जावास्क्रिप्ट में कार्यों को "नष्ट" करने का कोई तरीका है? मैंने फ़ंक्शन समाप्त होने पर फ़ंक्शन को शून्य पर घोषित करने का प्रयास किया है लेकिन यह काम नहीं करता है। इसके अंदर कार्य और घटनाएं अभी भी मौजूद हैं।

किसी के पास कोई सुराग है?

डेमो यहाँ पेज -> http://dreamerscorp.com/test/test01/javascript_destory_test.html

संपादित 2009/10/31 :) धन्यवाद आपके लिए एक बहुत मदद करता है, अपनी टिप्पणी मेरे लिए बहुत उपयोगी हैं, धन्यवाद फिर से !!!

+0

+1! –

+0

हां, डेमो पेज के लिए एक और +1। –

उत्तर

3

मूल रूप से आप की जरूरत: समारोह के भीतर ही

myFunction = null; 
// or 
myFunction = function() {}; 

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

यदि आप कुछ कोड पोस्ट करते हैं तो यह मदद कर सकता है; तो हम एक बेहतर जवाब दे सकते हैं।

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

यहाँ क्या हो रहा है है, तो आप एक बंद है कि युक्त समारोह से अधिक जीवित होगा बना रहे हैं:

function edit(){ 
     $('.edit').click(function(){ 
     //... 
     function _edit(boxTitle,selectedItemAmount){ 
      //... 
      $('#box .yes').click(function(){ 
      alert(boxTitle + ' for ' + selectedItemAmount + ' selected item'); 
      $('#msg').hide(); // hide msg box when yes btn is clicked 
      }); 
     } 
     //... 
     $('#box .no').click(function(){ 
      $('#msg').hide(); 
     }); 
     }); 

दूसरे शब्दों में, एक समारोह के अंदर, आप ' फिर से कहें, "इस कार्य को किसी DOM ऑब्जेक्ट से संलग्न करें," और आप इसे इनलाइन कर रहे हैं। जावास्क्रिप्ट बाहरी संदर्भों से चर को कैप्चर करता है और आंतरिक संदर्भ के संदर्भ में जीवित रहता है।

आपको क्या करने की जरूरत है कार्यों को परिभाषित करने के लिए कहीं न कहीं इनलाइन और फिर उन्हें का उपयोग नहीं है:

function boxClickYes(e) { 
     alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount + 
     ' selected item'); 
     $('#msg').hide(); // hide msg box when yes btn is clicked 
    } 
    function boxClickNo(e) { 
     $('#msg').hide(); 
    } 
    function edit(){ 
     $('.edit').click(function(){ 
     //... 
     function _edit(boxTitle,selectedItemAmount){ 
      //... 
      $('#box .yes').bind("click", {boxTitle: boxTitle, 
      selectedItemAmount: selectedItemAmount}, boxClickYes); 
     } 
     //... 
     $('#box .no').click(boxClickNo); 
     }); 

यह भी दर्शाता है कि कैसे समय के बीच में डाटा स्टोर करने jQuery क्लिक संचालकों में डेटा संपत्ति का उपयोग करने की हैंडलर और जिस समय आप इसका उपयोग करते हैं उसे संलग्न करें (उस डेटा को बंद करने के बजाय जो स्मृति में स्कोप चेन रखेगा)। इनलाइन-परिभाषित फ़ंक्शंस का उपयोग करना ठीक है जब आप इसका उपयोग कर रहे हैं (उदाहरण के लिए $.each के शरीर की तरह) लेकिन जब आप ईवेंट हैंडलर को जोड़ रहे हों तो यह ठीक नहीं है।

+0

http://dreamerscorp.com/test/test01/javascript_destory_test.html नमूना कोड यहां :) तो आपका मतलब है कि मुझे फ़ंक्शन के भीतर हर घटना को अनइंड करना होगा और सभी कार्यों को शून्य पर सेट करना होगा? – ben

+0

धन्यवाद !!! यह एक बहुत अच्छा डेमो है !! बहुत उपयोगी!! – ben

+0

आपका स्वागत है। –

7

आप समारोह को रद्द करने का प्रयास करें या एक गुमनाम समारोह करता है कि कुछ भी नहीं बताए इसे ओवरराइड कर सकते हैं:

var autoDestroy = function() { 
    autoDestroy = null; 
    //... 
    return 1; 
}; 

autoDestroy(); // returns 1 
autoDestroy(); // TypeError: autoDestroy is not a function 
+0

बहुत चालाक डिजाइन! –

+0

मुझे नहीं लगता कि वह वास्तव में एक समारोह को नष्ट करने के लिए पूछ रहा है; बल्कि, वह उन संदर्भों को उलझाने के लिए कह रहा है जो इसे स्मृति में रहने का कारण बनते हैं। –

+0

@ एंथनी: हाँ, मुझे लगता है कि हमें सटीक उत्तर देने के लिए अपना कोड देखने की आवश्यकता है – CMS

1

जावास्क्रिप्ट में किसी फ़ंक्शन को "नष्ट" करने के लिए, बस यह सुनिश्चित करें कि फ़ंक्शन पहुंच योग्य नहीं है। यह फ़ंक्शन को पुनः दावा के लिए योग्य होने में सक्षम करेगा। यह देखने के लिए एक बात यह है कि जावास्क्रिप्ट वैरिएबल स्कॉप्स (व्यक्तिगत चर के रूप में नहीं) और एक गुंजाइश के आधार पर बाध्य होते हैं, कई अप्रयुक्त वस्तुओं के साथ, यदि बाध्यकारी दायरे में रखा जाता है तो जारी रह सकता है:कोई और सहायता प्रदान करने के लिए विशिष्ट कोड का ज्ञान और इसका उपयोग कैसे किया जाता है।

कृपया जावास्क्रिप्ट डिलीवरी ऑपरेटर को एक चर या ऑब्जेक्ट सदस्य को हटाने का एक तरीका के रूप में देखें। मूल्य को शून्य/अपरिभाषित/अन्य ऑब्जेक्ट पर सेट करना पहले संदर्भित ऑब्जेक्ट तक पहुंचने की विधि पर हटा देता है (हालांकि यह अभी भी अन्यथा पहुंच योग्य हो सकता है और इस प्रकार पुनः दावा नहीं किया जा सकता है) लेकिन वेरिएबल/सदस्य से छुटकारा नहीं मिलता है।

delete variable 
delete obj.member 
delete obj[member] 
+0

मदद के लिए धन्यवाद, मैंने अभी फ़ंक्शन को "हटाएं" का उपयोग करने का प्रयास किया है, लेकिन हटाए गए कार्यों के भीतर फ़ंक्शंस और वेरिएबल्स अभी भी मौजूद हैं .. निम्नलिखित नमूना कोड है :) http://dreamerscorp.com/test/test01/ javascript_destory_test.html – ben

+0

@ben मुझे समझ में नहीं आता कि आप इस मामले में अभी भी मौजूद हैं। * तथ्य यह है कि अस्तित्व को सकारात्मक के रूप में परीक्षण किया जा सकता है, यह दर्शाता है कि वस्तुएं पुनर्विचार के लिए योग्य नहीं हैं * (जिसका अर्थ है कि वे मौजूद हैं ...) क्या इसका कोई विशेष तरीका परीक्षण किया जा रहा है? वांछित परिणाम क्या है? –

+0

मुझे जावास्क्रिप्ट के अपने खराब ज्ञान के लिए माफ़ कर दो। कार्यों का मेरा मतलब अभी भी मौजूद है क्योंकि वे "क्लिक" ईवेंट में हैं और "क्लिक" ईवेंट "एडिट" नामक फ़ंक्शन में है जो चुनिंदा "स्टॉप" ईवेंट के तहत है (कृपया डेमो कोड देखें)। तो हर बार जब मैं चयन योग्य आग लगाना स्मृति में एक नया हैंडलर स्टोर होगा। मैंने "संपादन" फ़ंक्शन को शून्य के रूप में अस्वीकार करने या "हटाएं" ऑपरेटर का उपयोग करने की कोशिश की लेकिन यह काम नहीं किया। मुझे लगता है कि मेरी समस्या एंथनी मिल्स ने क्या कहा है। मुझे ईवेंट हैंडलर संलग्न करने के लिए इनलाइन-परिभाषित फ़ंक्शंस का उपयोग नहीं करना चाहिए।मदद के लिए धन्यवाद :) – ben

6

इस उदाहरण में jQuery उपयोग अनबाइंड समारोह http://docs.jquery.com/Events/unbind

$("something").click(function() { 
    $("anotherOne").click(function() { 
     .... 
    }); 
}); 

में घटनाओं निकल करने के लिए, हर बार "कुछ" क्लिक किया जाता है, एक ईवेंट हैंडलर के लिए "anotherOne" जोड़ा जाता है, इसलिए यदि आप तीन क्लिक बार, आपको तीन इवेंट हैंडलर मिलेंगे।

$("something").click(function() { 
    $("anotherOne").unbind('click').click(function() { 
     .... 
    }); 
}); 

यहां आपको "एक और" पर केवल एक क्लिक हैंडलर होने की गारंटी है।

पिछले हैंडलर को स्पष्ट रूप से नष्ट करने की कोई आवश्यकता नहीं है। डेमो पेज के लिए

+0

ऐसा करने से यदि मेरे पास $ ("anotherOne") में फ़ंक्शन हैं। अनबिंड ('क्लिक करें')। क्लिक करें (function() {// function here}); क्या वे अभी भी मौजूद हैं? मेरा मतलब है कि "अनबिंड" सिर्फ घटना को हटा दें या घटना के भीतर घटना और कार्यों दोनों को हटा दें? – ben

+0

बहुत बहुत धन्यवाद !!! मुझे लगता है कि यह मेरी समस्याओं का समाधान करता है :) – ben

+1

jquery के "एक" फ़ंक्शन का उपयोग करने के बारे में क्या: $ ("कुछ")। एक ("क्लिक करें", फ़ंक्शन() { $ (यह) .one ("क्लिक करें", फ़ंक्शन() { }); }); यह प्रत्येक मिलान तत्व के लिए एक बार निष्पादित करेगा और कभी भी नहीं। http://docs.jquery.com/Events/one –

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