2011-05-24 17 views
7

मैं अपने कस्टम स्कोप के साथ window.setTimeot फ़ंक्शन का आह्वान करना चाहता हूं, इसलिए मैं call विधि का उपयोग करता हूं, लेकिन कुछ गड़बड़ है।जावास्क्रिप्ट सेटटाइमआउट कॉल त्रुटि

function foo() { 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout.call(this,this.bar,100); 
    } 
    this.bar(); 
} 

new foo; 

फ़ायरफ़ॉक्स के तहत इस कंसोल केवल 1 लाइन और फिर कुछ भी नहीं करने के लिए प्रिंट, और गूगल के तहत क्रोम यह एक TypeError फेंकता है।

मेरे कोड में समस्या क्या है?

उत्तर

8

call का उपयोग करते हुए यहाँ मदद नहीं करता है: यह आपके this वस्तु के साथ setTimeout कहता है, लेकिन कॉलबैक फ़ंक्शन ही अभी भी वैश्विक दायरे से कहा जाता है।

function foo() { 
    var self = this; 
    this.bar = function() { 
     console.log("keep going"); 
     window.setTimeout(function() { self.bar(); }, 100); 
    } 
    this.bar(); 
} 

संपादित करें:: तुम सच में call दृष्टिकोण के लिए कुछ इसी तरह चाहते हैं, आप bind उपयोग कर सकते हैं जो एक समारोह के लिए this मूल्य बांधता:

window.setTimeout(this.bar.bind(this), 100); 
क्या तुम सच में क्या करना चाहते हैं कुछ इस तरह है

हालांकि, यह नई ईसीएमएस्क्रिप्ट 5 spec का हिस्सा है जो अभी तक सभी ब्राउज़रों द्वारा समर्थित नहीं है।

+0

धन्यवाद, मुझे पता है कि इस तरह से काम करता है, मैं 'कॉल' का उपयोग करने की कोशिश कर रहा हूं। –

+1

@ सम्मोहन: आप इस उद्देश्य के लिए 'कॉल' का उपयोग नहीं कर सकते हैं। जो आप खोज रहे हैं वह है ['bind'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind), जो कि नई ईसीएमएस्क्रिप्ट 5 spec का हिस्सा है। इसका उपयोग करके, आप ऐसा कुछ कर सकते हैं: 'window.setTimeout (this.bar.bind (this), 100)'। – casablanca

+0

सही समझ में आता है। मैंने वही गलती की, 'सेटटाइमआउट' पर 'कॉल' का उपयोग करने का कोई मतलब नहीं है क्योंकि आप 'setTimeout' के 'इस' को बदलने की कोशिश नहीं कर रहे हैं, बल्कि, आप जिस फ़ंक्शन को तर्क के रूप में पारित कर रहे हैं। चियर्स – chiliNUT

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