2010-07-26 15 views
11

मैं एक जावास्क्रिप्ट समारोह है बुलाया गया थाकैसे एक समारोह का पता लगाने के साथ जावास्क्रिप्ट

जांच करने का तरीका

अगर समारोह बुलाया गया था (<head></head> अनुभाग में इस कार्य हो) तो समारोह फोन नहीं

समारोह अगर आमंत्रित नहीं किया गया (<head></head> अनुभाग में इस समारोह नहीं किया है) तो समारोह

require_once या include_once तरह php के साथ फोन

+०१२३५१६४१०

मुझे मदद धन्यवाद

+0

संभव डुप्लिकेट http://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function -इन-जावास्क्रिप्ट) – Ralgha

उत्तर

24

दो विकल्प:

स्थैतिक चर यहाँ स्थिर (जैसे सी में) स्वयं को बंद करने में अपने स्थैतिक चर स्टोर करने के लिए कार्य करता है कॉलिंग का उपयोग करके चर बनाने का तरीका बताया। इसे चलाता के बाद

var myFun = (function() { 
    var called = false; 
    return function() { 
    if (!called) { 
     console.log("I've been called"); 
     called = true; 
    } 
    } 
})() 

खाली समारोह प्रतिस्थापन एक खाली कार्य करने के लिए समारोह सेट करें।

function callonce() { 
    console.log("I've been called"); 
    arguments.callee = function() {}; 
} 

सार विचार यहाँ एक समारोह में एक समारोह है कि केवल एक बार कहा जाता हो जाता है, इस तरह से हम हर कार्य करने के लिए बॉयलर प्लेट कोड जोड़ने के बारे में चिंता करने की जरूरत नहीं है देता है कि है।

function makeSingleCallFun(fun) { 
    var called = false; 
    return function() { 
    if (!called) { 
     called = true; 
     return fun.apply(this, arguments); 
    } 
    } 
} 

// Alternate implementation 
function makeSingleCallFun(fun) { 
    return function() { 
     return fun.apply(this, arguments); 
     arguments.callee = function() {}; 
    } 
} 

var myFun = makeSingleCallFun(function() { 
    console.log("I've been called"); 
}); 
myFun(); // logs I've been called 
myFun(); // Does nothing 
की [कैसे पता है जावास्क्रिप्ट में फोन करने वाले समारोह?] (
+0

किसने इसे कम किया? –

+0

@SeanPatrickFloyd को संतुलित करने के लिए +1 मैंने शुरुआत में सोचा था कि 'कैली' एक 'टाइप' फ़ंक्शन नाम के बारे में एक टाइपो था, लेकिन यह एक चर है और मैच करता है, इसलिए मुझे नहीं पता कि क्यों डाउनवॉट किया गया था। क्या आपने टिप्पणी करने से पहले कोड का प्रयास किया था? – erm3nda

+3

@ erm3nda कोई विचार नहीं। यह 4 साल पहले है –

3
var called = false; 
function blah() { 
    called = true; 
} 

if (!called) { 
    blah(); 
} 
+1

उन वैश्विक चर-नाज़ियों के लिए [चूंकि यह वैश्विक दायरे में है], आप var blah के बजाय blah.called का उपयोग कर सकते हैं ... मानते हुए ब्लाह पहले ही परिभाषित है। हालांकि, यह कोड मेरे लिए काफी सुंदर है। – Warty

+0

इस पैटर्न का नुकसान यह है कि आपको फ़ंक्शन कॉल को हर जगह सशर्त कथन में लपेटना पड़ता है। –

+0

@ItzWarty यह मेरे लिए काफी सुंदर नहीं है, क्योंकि टोरोक गैबर ने बताया।ग्लोबल्स खराब होने का एक कारण है, इसलिए मैं उन्हें प्लेग की तरह टालता हूं, मुझे ग्लोबल-नाज़ी कहता हूं! यहां कई अन्य उदाहरण हैं जो वैश्विक चर का उपयोग नहीं करते हैं और हर जगह एक सशर्त के साथ कॉल को लपेटने की आवश्यकता नहीं होती है, इसे –

4

, पूरा करने के लिए आसान है कि के रूप में जावास्क्रिप्ट कार्यों वस्तुओं के सदस्यों और गुण हो सकता है कर रहे हैं:

var callMeOnlyOnce=function(){ 

    if(this.alreadyCalled)return; 

    alert('calling for the first time'); 

    this.alreadyCalled=true; 
}; 

// alert box comes 
callMeOnlyOnce(); 


// no alert box 
callMeOnlyOnce(); 

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

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

if(!window.mynamespace){ 
    window.mynamespace={}; 
} 

mynamespace.callMeOnlyOnce=function(){ 

    if(mynamespace.alreadyCalled)return; 

    alert('calling for the first time'); 
    mynamespace.alreadyCalled=true; 
}; 

// alert box comes 
mynamespace.callMeOnlyOnce(); 


// no alert box 
mynamespace.callMeOnlyOnce(); 
+1

कहा जाता है 'यह' मान वैश्विक वस्तु को संदर्भित करता है, न कि कार्य के लिए, और' allreadyCalled' वैश्विक वस्तु की संपत्ति होने के अंत में। ऐसा इसलिए है क्योंकि फ़ंक्शन को उस संदर्भ से बुलाया गया है जिसमें मूल वस्तु नहीं है: 'कॉल करें केवल एक बार(); '। ['This'] पर अधिक जानकारी (http://stackoverflow.com/questions/3320677/this-operator-in-javascript/3320706#3320706) – CMS

10

सजावटी पैटर्न का उपयोग करें।

// your function definition 
function yourFunction() {} 

// decorator 
function callItOnce(fn) { 
    var called = false; 
    return function() { 
     if (!called) { 
      called = true; 
      return fn(); 
     } 
     return; 
    } 
} 

yourFunction(); // it runs 
yourFunction(); // it runs  
yourFunction = callItOnce(yourFunction); 
yourFunction(); // it runs 
yourFunction(); // null 

यह समाधान आपके लक्ष्य को प्राप्त करने के लिए एक दुष्प्रभाव मुक्त तरीका प्रदान करता है। आपको अपने मूल कार्य को संशोधित करने की आवश्यकता नहीं है। यह पुस्तकालय कार्यों के साथ भी अच्छा काम करता है। आप मूल फ़ंक्शन को संरक्षित करने के लिए सजाए गए फ़ंक्शन पर नया नाम असाइन कर सकते हैं।

var myLibraryFunction = callItOnce(libraryFunction); 
myLibraryFunction(); // it runs 
myLibraryFunction(); // null 
libraryFunction(); // it runs 
+0

अरे नहीं, मैंने आपका जवाब छोड़ दिया, और एक उत्तर जोड़ा जो लगभग है वही। मैं अपना जवाब छोड़ दूंगा क्योंकि मैंने एक अलग तरीका भी दिखाया था। हालांकि, यह सजावटी पैटर्न कैसा है? मुझे लगता है कि यह पहलू उन्मुख प्रोग्रामिंग की तरह है। –

+0

@ जुआन आप दोनों सही हैं, एओपी अक्सर सजावटी पैटर्न –

0
If (!your_func.called) { 
    your_func.called = true; 
    your_func(); 
} 
+0

का उपयोग करता है, सभी उत्तरों में से, यह वह है जिसके लिए कोड की सबसे पुनरावृत्ति की आवश्यकता होती है। प्रत्येक कॉल को ध्वज सेट करने और सशर्त के साथ लपेटने की आवश्यकता होती है। –

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