2012-11-27 15 views
5

में इसे क्रोम बग या सफारी/फ़ायरफ़ॉक्स उदारता माना जाएगा?एक बंद नाम इसके अंदर एक ही नाम के फ़ंक्शन के साथ संघर्ष करता है, लेकिन केवल क्रोम

जब मैं एक बंद समारोह बनाता हूं, तो मैं इसे एक मनमाना नाम देता हूं, "बटन"। बंद होने के भीतर, मेरे पास एक ऐसा कार्य है जो बंद करने के मुख्य उद्देश्य के लिए एक निर्माता है, जिसे "बटन" भी कहा जाता है।

बंद करने का बटन बटन का संदर्भ देता है, संभवतः आंतरिक फ़ंक्शन बटन()।

var closure = (function Button(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button, 
     }; 

}()); 

//now let's call our closure to create a new Button 
var newButton = new closure.Button() 

सफारी और फ़ायरफ़ॉक्स में, यह कोई समस्या नहीं है। नए बंद करने को बुलाओ। बटन() आंतरिक बटन() का एक उदाहरण देता है। क्रोम में, हालांकि, जब एक आंतरिक फ़ंक्शन नाम बंद फ़ंक्शन नाम से मेल खाता है, तो कन्स्ट्रक्टर को कॉल नहीं किया जाता है। जो लौटाया जाता है वह बंद कार्य ही होता है। यह निश्चित रूप से त्रुटियों की ओर जाता है जब आंतरिक फ़ंक्शन उन विधियों को परिभाषित करता है जिन्हें मैं बाद में कोशिश करता हूं और कॉल करता हूं।

मैं दो कारणों से इस प्रश्न पोस्ट कर रहा हूँ:

1) यह मुझे एक दिन से अधिक ले लिया (में समस्या है, जो क्रोम रिपोर्टिंग कर रहा था कि मेरे बटन विधि .activate नहीं है के कारणों का पता करने के लिए मेरा असली कोड, बटन एक मूल वस्तु से प्राप्त होता है जो एक .activate() विधि प्रदान करता है)। यदि कोई और इस मुद्दे में चलता है, तो वे यहां मेरा प्रश्न पा सकते हैं और खुद को कुछ समय बचा सकते हैं।

2) मुझे आश्चर्य है: अगर यह मेरे हिस्से में एक त्रुटि है, तो बंद करने के भीतर बंद करने और एक समारोह दोनों के लिए समान नाम का उपयोग करने के लिए, यह सफारी/फ़ायरफ़ॉक्स में क्यों काम कर रहा है? अधिक विशेष रूप से, क्या क्रोम वास्तव में किसी भी तरह बंद होने की वापसी कर रहा है, न कि इच्छित आंतरिक कार्य? क्या यह एक बग है?

+6

क्रोम में कोई रेपो नहीं: http://jsfiddle.net/77LZh/ –

+0

मैंने आईई में नामित फ़ंक्शन एक्सप्रेशन के साथ समस्याओं के बारे में सुना है (देखें [यहां] (http://kangax.github.com/nfe/)), लेकिन क्रोम नहीं। और वास्तव में @ सेनकिंसे का परीक्षण क्रोम में ठीक काम करता प्रतीत होता है। आपको क्या लगता है कि निर्माता को बुलाया नहीं जा रहा है? – bfavaretto

उत्तर

1

शायद सटीक समस्या नहीं है, लेकिन आप अनावश्यक रूप से फ़ंक्शन अभिव्यक्ति नामित करते हैं।

var closure = (function Button(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button, 
     }; 

}()); 
//now let's call our closure to create a new Button 
var newButton = new closure.Button() 

अंतर किया जा रहा शीर्ष स्तर समारोह अज्ञात है कि होना चाहिए

var closure = (function(){ 

    //the closure's primary object 
    function Button(target) { 
     //constructor for our button object 
    } 

    Button.prototype = e.inherit(e.Plugin.prototype); 
    Button.prototype.constructor = Button; 

    return { 
      Button: Button 
     }; 

}()); 

//now let's call our closure to create a new Button 
var newButton = new closure.Button(); 

। किसी ऐसे नाम का नाम देने की आवश्यकता नहीं है जिसका आप कभी भी उपयोग नहीं करेंगे।

इसके अलावा, आपको रिटर्न ऑब्जेक्ट में कॉमा नहीं होना चाहिए। यह एक वाक्यविन्यास त्रुटि के रूप में आना चाहिए।

इसके अलावा, आपके पास अंतिम पंक्ति पर कोई समापन अर्ध कोलन नहीं है।

+0

यह कोई मदद नहीं है - जावास्क्रिप्ट का लेक्सिकल स्कॉपिंग इसे किसी समस्या से रोकता है। कमांड और सेमी के संबंध में नाइट पर्याप्त हैं, लेकिन इस मुद्दे के प्रति समझदार नहीं हैं। –

+0

@ सेनकिंसे मैं इसे कोई मदद नहीं कहूंगा। यद्यपि आपका अधिकार, किसी ऐसे मुद्दे को ठीक करना मुश्किल है जिसे आप पुन: पेश नहीं कर सकते हैं। मैं सिर्फ गाम चलाने की कोशिश कर रहा था। – dqhendricks

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