2010-08-17 14 views
11

में मुझे विशिष्ट जेएस फ़ंक्शन को कॉल करने की आवश्यकता है। समस्या यह है कि कई बार रनटाइम स्थिति आ सकती है जहां एक और जेएस फ़ाइल में एक ही नाम फ़ंक्शन हो सकता है। लेकिन मुझे यह विशिष्ट होना चाहिए कि मुझे कौन सा फ़ंक्शन कॉल करने का अनुमान है। फ़ंक्शन ओवरलोडिंग मेरा समाधान नहीं है।एक विशिष्ट जावास्क्रिप्ट फ़ंक्शन को कॉल करें जब एकाधिक समान नाम फ़ंक्शन मेमोरी

धन्यवाद और सादर, तन्मय

+0

[दो ही नाम का उपयोग करने के संभावित डुप्लिकेट विभिन्न .js फ़ाइलों में विधि] (http://stackoverflow.com/questions/3492636/use-two-same-name-method-in- अलग-js-files) –

+0

"फ़ंक्शन ओवरलोडिंग" से आपका क्या मतलब है? फंक्शन क्लोनिंग? –

उत्तर

2

कम से कम फ़ायरफ़ॉक्स में, आप ही नाम के दो कार्यों जब, दूसरा पहले एक ऊपर लिख देगा।

तो, आप पहले को कॉल नहीं कर सकते हैं।

यह प्रयास करें:

function a() {alert(1);} 
function a() {alert(2);} 
a(); // alerts '2' 

jsfiddle में देखें।

+0

न केवल फ़ायरफ़ॉक्स में; प्रत्येक * ब्राउज़र * के * हर * जावास्क्रिप्ट इंजन में। आप इसे सशर्त रूप से भी नहीं कर सकते हैं, क्योंकि परिणाम अप्रत्याशित होगा। उदा।, [यह कोड] देखें (http://jsbin.com/iwifi3/edit): कई ब्राउज़रों में (कम से कम क्रोम और ओपेरा में), शर्त के बावजूद, पहली फ़ंक्शन घोषणा हमेशा दूसरी बार ओवरराइट की जाती है। –

+0

क्या दूसरा फ़ंक्शन पहले फ़ंक्शन को कॉल करने का कोई तरीका है? –

1

जावास्क्रिप्ट में, समान नामित फ़ंक्शंस स्वचालित रूप से सटीक उसी नाम से परिभाषित पिछले फ़ंक्शन को ओवरराइड करते हैं।

मान लें कि आपके पृष्ठ में 1.js और 2.js शामिल हैं और दोनों एक ही फ़ंक्शन को परिभाषित करते हैं, उदाहरण के लिए, प्रदर्शित करें()। इस मामले में, किस जेएस फ़ाइल पर आखिरी शामिल है, उस फ़ाइल में 'डिस्प्ले()' की परिभाषा अन्य सभी पूर्व परिभाषाओं को ओवरराइड कर देगी।

10

आपको अपने संसाधनों के कुछ पुनर्गठन करना होगा और जहां आप कर सकते हैं नामस्थान का उपयोग करना होगा।

यदि आपके पास saySomething नामक एक विधि है जिसे आप दो बार परिभाषित करते हैं, तो आप उनमें से एक को किसी ऑब्जेक्ट में ले जायेंगे (जो भी आपकी आवश्यकताओं को बेहतर बनाता है)।

var myNS = new (function() { 

    this.saySomething = function() { 
     alert('hello!'); 
    }; 

})(); 

और अन्य परिभाषा को एक अलग वस्तु में स्थानांतरित किया जा सकता है या यहां तक ​​कि अकेला छोड़ दिया जा सकता है।

function saySomething() { 
    alert('derp!'); 
} 

आप अब saySomething विधि की तरह

saySomething();  // derp! 
myNS.saySomething(); // hello! 

संपादित कॉल कर सकते हैं: के बाद से यह टिप्पणी में लाया गया था, इस

var myNS = { 
    saySomething: function() { 
     alert('hello!'); 
    } 
}; 

, पहले कोड ब्लॉक के बराबर है सरल में फॉर्म (अगर मैं सही ढंग से याद कर रहा हूं)।

+0

+1 कुछ विकल्प देने के लिए –

+0

अच्छा जवाब, लेकिन आप [ऑब्जेक्ट शाब्दिक नोटेशन] का उपयोग क्यों नहीं कर रहे हैं (http://www.wait-till-i.com/2006/02/16/show-love-to- वस्तु शाब्दिक /)? –

+0

@ मार्सल कोर्पेल आदत मुझे लगता है। आम तौर पर जब मैं कोई वस्तु बनाता हूं तो वहां "निजी" चर होते हैं, जो शाब्दिक नोटेशन के साथ उपलब्ध नहीं होते हैं (या मुझे नहीं पता कि उन्हें कैसे करना है)। – lincolnk

1

मैं समारोह गुंजाइश का उपयोग चर और कार्यों

यहाँ के दायरे को सीमित करने के एक उदाहरण है:

// existing function in JavaScript 
function one() { 

console.log('one'); 
} 

one(); // outputs one 

// inserting new JavaScript 
(function() { // anonymous function wrapper 
'use strict'; // ECMAScript-5 

    function one() { 

    console.log('two'); 
    } 


    one(); // outputs two 

})(); // end of anonymous function 

one(); // outputs one 

मुझे आशा है कि मदद करता है :)

+0

यह मेरी समस्या को हल करता है जहां मेरी .js फ़ाइलों को "शामिल" कथन के माध्यम से डाला जाता है और इसलिए फ़ंक्शन का नाम बदला नहीं जा सका। – Pierrick

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