उस फ़ंक्शन के भीतर से फ़ंक्शन का नाम कैसे प्राप्त करें?


263

मैं उस फ़ंक्शन के अंदर से एक फ़ंक्शन नाम कैसे एक्सेस कर सकता हूं?

// parasitic inheritance
var ns.parent.child = function() {
  var parent = new ns.parent();
  parent.newFunc = function() {

  }
  return parent;
}

var ns.parent = function() {
  // at this point, i want to know who the child is that called the parent
  // ie
}

var obj = new ns.parent.child();

ठीक है, अभिभावक में, मैं तब ns [बच्चे] [स्कीमा] या ns [बच्चे] [dbService] जैसे सम्मेलन द्वारा अन्य कार्यों का उपयोग कर सकता हूं। इसके बिना, मुझे हर बच्चे की कक्षा में इन संदर्भों को कठिन कोड देना होगा।
स्कॉट कर्लेनबैक

सिर्फ अभिभावक के तर्क के रूप में बच्चे के समारोह को पारित क्यों नहीं किया? var जनक = नया ns.parent (यह);
प्लोडर

क्योंकि इस तरह के दर्जनों लुक और दर्जनों बच्चे हैं। यही कारण है कि वर्तमान में मैं क्या कर रहा हूं, लेकिन यह हर बार एक ही है और यह सही होगा यदि डुप्लिकेट तर्क को केवल एक बार जनक के अंदर रखा जा सकता है, जो व्युत्पन्न फ़ंक्शन पर आधारित है।
स्कॉट Klarenbach

देखिए, यह मेरे द्वारा चाहा गया चाइल्ड फंक्शन नहीं है, इसका उपयोग नामकरण सम्मेलन है, क्योंकि उस नामकरण सम्मेलन का उपयोग अन्य कार्यों को लोड करने के लिए किया जा सकता है जो वर्तमान में चाइल्ड ऑब्जेक्ट पर परिभाषित नहीं हैं, लेकिन पूरे सिस्टम में उस बच्चे से संबंधित हैं।
स्कॉट कर्लेनबैच

1
@ सच कहें तो मुझे ऐसा करने की आवश्यकता है, आपकी जटिलता और कोड संरचना को प्रबंधित करना हर किसी से सहमत है। इस तरह की हार्ड-कपलिंग एक खराब डिज़ाइन निर्णय है और एक गड़बड़ बनाने जा रही है। @SimeVidas आपका एक बेहतरीन नेक्रोमन्ट :)
रेयनोस

जवाबों:


163

ES5 में, सबसे अच्छी बात यह है:

function functionName(fun) {
  var ret = fun.toString();
  ret = ret.substr('function '.length);
  ret = ret.substr(0, ret.indexOf('('));
  return ret;
}

का उपयोग करना Function.callerगैर-मानक है। Function.callerऔर arguments.calleeदोनों सख्त मोड में निषिद्ध हैं।

संपादित करें: nus का regex आधारित उत्तर नीचे एक ही बात को प्राप्त करता है, लेकिन इसमें बेहतर प्रदर्शन है!

ES6 में, आप बस उपयोग कर सकते हैं myFunction.name

नोट: सावधान रहें कि कुछ जेएस मिनिफ़ायर फ़ंक्शन के नामों को फेंक सकते हैं, बेहतर सेक करने के लिए; इससे बचने के लिए आपको उनकी सेटिंग्स को ट्विक करने की आवश्यकता हो सकती है।


हालांकि इसने मेरे लिए पर्याप्त रूप से इस सवाल का जवाब नहीं दिया (अनाम कार्यों के कारण), इसने मुझे ऐसा करने का विचार दिया: fun.toString().substr(0, 100)जो मेरी जरूरतों के लिए प्रश्न में फ़ंक्शन का पता लगाने के लिए पर्याप्त होगा। तो, प्रेरणा के लिए धन्यवाद!
कैम्पबेलन

3
myFunction.nameES6 में हाँ करना सबसे अच्छी बात है।
व्लाद ए इओन्सक्यू

15
में फ़ायदा क्या है myFunction.nameअगर आप समारोह नाम टाइप करें? जादू चर के उद्देश्य को हराता है।
अदि ५१ ad

2
@ adi518: जरूरी नहीं कि मान लें कि आपके पास कार्यों की कोई भी सरणी है और आप इस पर ध्यान दे रहे हैं, इसके लिए / foreach का उपयोग कर रहे हैं .. arr[index].nameयह भी काम करेगा :)
Debasish Chowdhury

2
@ adi518 यह बेकार नहीं है। यदि मैं अपनी IDE के भीतर फ़ंक्शन का नाम बदल रहा हूं, myFunction.nameतो भी अपडेट किया जाएगा। निश्चित रूप से, इंटेलीजे स्ट्रिंग के भीतर पहचानकर्ताओं का नाम बदलने का समर्थन करता है, लेकिन यह बहुत कम लगातार काम करता है और चुपचाप पुराना हो जाएगा अगर कोई "स्ट्रिंग्स में खोज" विकल्प पर टिक करना भूल जाता है। myFunction.nameस्ट्रिंग को हार्डकोड करने से थोड़ा बेहतर विकल्प है।
byxor

141

ES6 (नीचे भेजे गए हलीम के जवाब से प्रेरित):

myFunction.name

एमडीएन पर स्पष्टीकरण । 2015 के रूप में IE को छोड़कर नोडज और सभी प्रमुख ब्राउज़रों में काम करता है।

नोट: बाध्य कार्यों पर यह " bound <originalName>" देगा। यदि आप मूल नाम प्राप्त करना चाहते हैं, तो आपको "बाध्य" पट्टी करना होगा।


ES5 (व्लाद के जवाब से प्रेरित):

यदि आपके पास फ़ंक्शन का संदर्भ है, तो आप कर सकते हैं:

function functionName( func )
{
    // Match:
    // - ^          the beginning of the string
    // - function   the word 'function'
    // - \s+        at least some white space
    // - ([\w\$]+)  capture one or more valid JavaScript identifier characters
    // - \s*        optionally followed by white space (in theory there won't be any here,
    //              so if performance is an issue this can be omitted[1]
    // - \(         followed by an opening brace
    //
    var result = /^function\s+([\w\$]+)\s*\(/.exec( func.toString() )

    return  result  ?  result[ 1 ]  :  '' // for an anonymous function there won't be a match
}
  • मैंने इस पर इकाई परीक्षण नहीं चलाए हैं, या कार्यान्वयन अंतर को सत्यापित किया है, लेकिन सिद्धांत रूप में यह काम करना चाहिए, अगर कोई टिप्पणी नहीं छोड़नी चाहिए।
  • नोट: बाध्य कार्यों पर काम नहीं करेगा
  • नोट: कि callerऔर calleeपदावनत माना जाता है।

[१] मैं इसे यहां शामिल करता हूं क्योंकि यह कानूनी है और अक्सर पर्याप्त सिंटैक्स हाइलाइटिंग टूल फ़ंक्शन नाम और कोष्ठक के बीच सफेद स्थान को ध्यान में रखने में विफल होते हैं। दूसरी ओर, मुझे .toString () के किसी भी कार्यान्वयन के बारे में पता नहीं है जिसमें यहां सफेद स्थान शामिल होगा, इसलिए आप इसे छोड़ सकते हैं।


मूल प्रश्न के उत्तर के रूप में, मैं परजीवी विरासत को छोड़ दूंगा और कुछ और पारंपरिक ओओपी डिजाइन पैटर्न के लिए जाऊंगा। मैंने एक TidBits.OoJs को C ++ की नकल करने वाले फीचर सेट (अभी तक पूर्ण नहीं, लेकिन अधिकतर) के साथ जावास्क्रिप्ट में OOP कोड को आराम से लिखने के लिए लिखा है ।

मैं उन टिप्पणियों से देखता हूं जिन्हें आप जानकारी देने से बचना चाहते parentहैं। मुझे यह स्वीकार करना चाहिए कि पारंपरिक डिजाइन पैटर्न आपको उस एक से नहीं बचाएंगे, क्योंकि आमतौर पर यह आपकी निर्भरता को स्पष्ट और लागू करने के लिए एक अच्छी बात मानी जाती है।

मैं अनाम कार्यों से दूर होने का सुझाव भी दूंगा। वे केवल PITA डिबगिंग और प्रोफाइलिंग करते हैं क्योंकि सब कुछ बस "गुमनाम फ़ंक्शन" के रूप में दिखाई देता है, और उनके लिए कोई लाभ नहीं है जिनके बारे में जानते हैं।


3
अच्छा RegEx! यहां एक प्रदर्शन परीक्षण दिखाया गया है कि आपका कोड कई मामलों में सबसे तेज है। सामान्य तौर पर ऐसा लगता है कि RegEx ने औसतन यहाँ JS को लगभग 2x गति से हराया। jsperf.com/get-function-name/2
Beejor

@Tomasz हाय, यह इंगित करने के लिए धन्यवाद। मुझे नहीं पता था। एक बाउंड फ़ंक्शन वास्तव में एक नया फ़ंक्शन है जो आपके मूल फ़ंक्शन को लपेटता है। पारिस्थितिकी मानक .2 19.2.3.2 यह परिभाषित करता है कि नए फ़ंक्शन का नाम "बाध्य" + मूल नाम होगा। TheString विधि बाध्य फ़ंक्शंस पर भी काम नहीं करेगी ... आपको बाध्य शब्द को पट्टी करना होगा।

यदि आप फ़ंक्शन नाम टाइप करते हैं तो myFunction.name में क्या बात है? जादू चर के उद्देश्य को हराता है।
बोरजोवस्की

ध्यान दें कि यदि आप प्रतिक्रियाशील मूल का उपयोग कर रहे हैं तो यह ठीक से काम नहीं कर सकता है। मेरे पास एक आरएन परियोजना है जो मैं एक्सपो संस्करण 36 के साथ काम कर रहा हूं और एक घटक विधि की .nameसंपत्ति स्ट्रिंग "मूल्य" के रूप में दिखाई दे रही थी, कोई फर्क नहीं पड़ता कि इसे क्या कहा गया था। अजीब रूप से पर्याप्त है, एक्सपो ऐप में परीक्षण करते समय यह ठीक था, हालांकि, एक बार वास्तविक एप्लिकेशन में संकलित करने के बाद, यह चुपचाप दुर्घटनाग्रस्त हो जाएगा।
एंडी कॉर्मैन

64

आप जो कर रहे हैं, वह अनाम फ़ंक्शन को वैरिएबल में असाइन कर रहा है। आपको संभवतः इसके बजाय फ़ंक्शन अभिव्यक्ति का नाम चाहिए ( http://kangax.github.com/nfe/ )।

var x = function x() {
    console.log( arguments.callee.name );
}
x();

हालाँकि मुझे यकीन नहीं है कि यह कितना क्रॉस-ब्राउज़र है; IE6 के साथ एक समस्या है जो आपको बाहरी दायरे में फ़ंक्शन के नाम को लीक करती है। इसके अलावा, आर्ग्युमेंट्स.क्लाइस एक तरह से हटा दिया गया है और यदि आप उपयोग कर रहे हैं तो त्रुटि होगी strict mode


1
यह सफ़ारी ब्राउज़र के पुराने संस्करणों पर काम नहीं करता है।
अनुभव गुप्ता

17

कोई भी constructorएक संपत्ति को उजागर करता है name, जो फ़ंक्शन नाम है। आप constructorएक उदाहरण के माध्यम से (का उपयोग करके new) या prototype:

function Person() {
  console.log(this.constructor.name); //Person
}

var p = new Person();
console.log(p.constructor.name); //Person

console.log(Person.prototype.constructor.name);  //Person

6
पहली console.logकॉल लॉग windowया Objectमेरे लिए निर्भर करती है कि मैं इसे कहां चलाता हूं, नहीं Person
एस

क्या आप सुनिश्चित हैं कि आपने "नया" का उपयोग कर त्वरित किया है? अन्यथा यह काम नहीं कर सकता।
रोले

14

यह सबसे बेवकूफी वाली बात लगती है, जिसे मैंने अपने जीवन में लिखा था, लेकिन यह मज़ेदार है: डी

function getName(d){
  const error = new Error();
  const firefoxMatch = (error.stack.split('\n')[0 + d].match(/^.*(?=@)/) || [])[0];
  const chromeMatch = ((((error.stack.split('at ') || [])[1 + d] || '').match(/(^|\.| <| )(.*[^(<])( \()/) || [])[2] || '').split('.').pop();
  const safariMatch = error.stack.split('\n')[0 + d];

  // firefoxMatch ? console.log('firefoxMatch', firefoxMatch) : void 0;
  // chromeMatch ? console.log('chromeMatch', chromeMatch) : void 0;
  // safariMatch ? console.log('safariMatch', safariMatch) : void 0;

  return firefoxMatch || chromeMatch || safariMatch;
}

d- ढेर की गहराई। 0- इस फ़ंक्शन का नाम लौटाएं, 1- माता-पिता, आदि;
[0 + d]- सिर्फ समझने के लिए - क्या होता है;
firefoxMatch- सफारी के लिए काम करता है, लेकिन मेरे पास परीक्षण के लिए वास्तव में थोड़ा समय था, क्योंकि मैक का मालिक धूम्रपान करने के बाद वापस आ गया था, और मुझे बाहर निकाल दिया: (

परिक्षण:

function limbo(){
  for(let i = 0; i < 4; i++){
    console.log(getName(i));
  }
}
function lust(){
  limbo();
}
function gluttony(){
  lust();
}

gluttony();

परिणाम:
क्रोम:
यहां छवि विवरण दर्ज करें

Fitefox:
यहां छवि विवरण दर्ज करें

यह समाधान केवल मनोरंजन के लिए बना रहा था ! वास्तविक परियोजनाओं के लिए इसका उपयोग न करें। यह ईएस विनिर्देश पर निर्भर नहीं करता है, यह केवल ब्राउज़र की प्राप्ति पर निर्भर करता है। अगले क्रोम / फ़ायरफ़ॉक्स / सफारी अपडेट के बाद इसे तोड़ा जा सकता है।
इससे अधिक कोई त्रुटि (हा) प्रसंस्करण नहीं है - यदि dस्टैक की लंबाई से अधिक होगी - तो आपको एक त्रुटि मिलेगी;
अन्य वेवर्स एरर के मेसैज पैटर्न के लिए - आपको एक त्रुटि मिलेगी;
यह ईएस 6 वर्गों ( .split('.').pop()) के लिए काम करना चाहिए , लेकिन आप दे सकते हैं कि एक कटाव मिल सकता है;


13

यह आपके लिए काम कर सकता है:

function foo() { bar(); }

function bar() { console.log(bar.caller.name); }

यदि आप किसी अनाम फ़ंक्शन से कॉल करते हैं, तो foo () रन करना "foo" या अपरिभाषित होगा।

यह कंस्ट्रक्टर के साथ भी काम करता है, इस स्थिति में यह कॉलिंग कंस्ट्रक्टर (उदाहरण के लिए "फू") के नाम को आउटपुट करेगा।

यहाँ अधिक जानकारी: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Caller

वे दावा करते हैं कि यह गैर-मानक है, लेकिन यह भी कि यह सभी प्रमुख ब्राउज़रों द्वारा समर्थित है: फ़ायरफ़ॉक्स, सफारी, क्रोम, ओपेरा और आईई।


सख्त मोड में उपलब्ध नहीं ... mmm
Ka Mok

8

आप नहीं कर सकते। फ़ंक्शंस में मानक के अनुसार नाम नहीं हैं (हालांकि मोज़िला में ऐसी विशेषता है) - उन्हें केवल नामों के साथ चर के लिए सौंपा जा सकता है।

आपकी टिप्पणी भी:

// access fully qualified name (ie "my.namespace.myFunc")

इस फंक्शन के अंदर है my.namespace.myFunc.getFn

आप जो कर सकते हैं वह नए द्वारा बनाई गई किसी वस्तु के निर्माता को वापस कर सकता है

तो आप कह सकते थे

var obj = new my.namespace.myFunc();
console.info(obj.constructor); //my.namespace.myFunc

1
मुझे इसकी दुर्गंध के अंदर आवश्यकता है क्योंकि मैं इसे वंशानुक्रम श्रृंखला से गुजार रहा हूँ और मैंने उस सामान को संक्षिप्तता के लिए छोड़ दिया है।
स्कॉट कर्लेनबैक

1
'यह' वह उदाहरण होगा जिसने फ़ंक्शन को लागू किया था। तो अगर आप मूल फ़ंक्शन के अंदर 'यह' करते हैं जो आपको उस फ़ंक्शन का उदाहरण देगा जो इसे कॉल करता है। आपको केवल इतना ही चाहिए - यह सुनिश्चित नहीं करना चाहिए कि आपको नाम की भी आवश्यकता क्यों है
प्लोडर

1
ठीक है, अभिभावक में, मैं तब ns [बच्चे] [स्कीमा] या ns [बच्चे] [dbService] जैसे सम्मेलन द्वारा अन्य कार्यों का उपयोग कर सकता हूं। इसके बिना, मुझे हर बच्चे की कक्षा में इन संदर्भों को कठिन कोड देना होगा।
स्कॉट कर्लेनबैक

1
नाम खोजने के लिए मेरा उपयोग मामला कंसोल के निर्माण के लिए आसान बनाने के लिए है। ऐसे संदेश जो बताते हैं कि संदेश कहां से आया है बिना स्टैक डंप के वापस आने के लिए। जैसे कंसोल। शेर ({'त्रुटि': {self.name संदर्भ} + "इनपुट पैरामीटर के साथ त्रुटि")। यदि आप हर बार अपने भीतर पाठ को रोकना और बदलना नहीं चाहते हैं, तो कई कार्यों में दोहराए जाने वाले त्रुटि संदेशों को काटना / पेस्ट करना बहुत आसान हो जाता है। मेरे मामले में, मैं कई वादे कॉल से वादा त्रुटियों को लौटा रहा हूं - यह जानने के लिए अच्छा है कि किस वादे / फ़ंक्शन ने त्रुटि उत्पन्न की।
स्कॉट

7

आप इसका उपयोग उन ब्राउज़र के लिए कर सकते हैं जो Error.stack का समर्थन करते हैं (लगभग सभी नहीं, शायद)

function WriteSomeShitOut(){ 
  var a = new Error().stack.match(/at (.*?) /);
  console.log(a[1]);
} 
WriteSomeShitOut();

बेशक यह वर्तमान फ़ंक्शन के लिए है, लेकिन आपको यह विचार मिलता है।

आप कोड करते समय खुश drooling


4

आप nameफ़ंक्शन का नाम पाने के लिए संपत्ति का उपयोग कर सकते हैं , जब तक कि आप एक अनाम फ़ंक्शन का उपयोग नहीं कर रहे हैं

उदाहरण के लिए:

var Person = function Person () {
  this.someMethod = function () {};
};

Person.prototype.getSomeMethodName = function () {
  return this.someMethod.name;
};

var p = new Person();
// will return "", because someMethod is assigned with anonymous function
console.log(p.getSomeMethodName());

अब नामांकित फ़ंक्शन के साथ प्रयास करें

var Person = function Person () {
  this.someMethod = function someMethod() {};
};

अब आप उपयोग कर सकते हैं

// will return "someMethod"
p.getSomeMethodName()


3

भाग के रूप में ECMAScript 6आप Function.name विधि का उपयोग कर सकते हैं

function doSomething() {}

alert(doSomething.name); // alerts "doSomething"

ReactJS में आपको इसे जोड़ना होगा: कंसोल.लॉग (this.doSomething.name);
बिटक्वाव

2
यह समारोह के बाहर है
स्कॉट

3

आप उपयोग कर सकते हैंFunction.name :

जावास्क्रिप्ट के अधिकांश कार्यान्वयन में, जब आपके पास आपके कंस्ट्रक्टर का संदर्भ गुंजाइश में होता है, तो आप इसके नाम की संपत्ति (जैसे Function.name, या Object.constructor.name) से इसका स्ट्रिंग नाम प्राप्त कर सकते हैं

आप उपयोग कर सकते हैंFunction.callee :

मूल arguments.callerविधि को हटा दिया गया है, लेकिन अधिकांश ब्राउज़र समर्थन करते हैं Function.caller, जो वास्तविक इनवॉइसिंग ऑब्जेक्ट (इसकी कोड की बॉडी) को लौटाएगा: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ समारोह / फोन करने वाले? redirectlocale = en-अमेरिका और redirectslug = जावास्क्रिप्ट% 2FReference% 2FGlobal_Objects% 2FFunction% 2Fcaller

आप एक स्रोत मानचित्र बना सकते हैं :

अगर आपको ज़रूरत है तो शाब्दिक फ़ंक्शन हस्ताक्षर (इसका "नाम") और न ही ऑब्जेक्ट है, तो आपको कुछ और अनुकूलित करने के लिए सहारा लेना पड़ सकता है, जैसे एपीआई स्ट्रिंग मानों की एक सरणी संदर्भ बनाने के लिए आपको आवश्यकता होगी। बार-बार पहुंचना। आप उन्हें एक साथ उपयोग कर सकते हैं Object.keys()और तार की अपनी सरणी, या बड़ी परियोजनाओं के लिए गीताहब पर मोज़िला के स्रोत मानचित्र पुस्तकालय में देख सकते हैं: https://github.com/mozilla/source-map


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन हाल ही में मैं डीबगिंग उद्देश्यों के लिए कुछ रिएक्ट घटक के तरीकों को सजाने की कोशिश करते हुए कुछ इसी तरह के मुद्दे का सामना कर रहा हूं। जैसा कि लोगों ने पहले ही कहा था, arguments.callerऔर arguments.calleeसख्त मोड में निषिद्ध है जो संभवतः आपके रिएक्ट ट्रांसपिलिंग में डिफ़ॉल्ट रूप से सक्षम है। आप इसे या तो निष्क्रिय कर सकते हैं, या मैं एक और हैक के साथ आने में सक्षम हो गया हूं, क्योंकि प्रतिक्रिया में सभी वर्ग कार्यों का नाम दिया गया है, आप वास्तव में ऐसा नहीं कर सकते हैं:

Component.prototype.componentWillMount = function componentWillMount() {
    console.log('Callee name: ', this.__proto__.constructor.toString().substr(0,30));
...
}

1

इसने मेरे लिए काम किया।

function AbstractDomainClass() {
    this.className = function() {
        if (!this.$className) {
            var className = this.constructor.toString();
            className = className.substr('function '.length);
            className = className.substr(0, className.indexOf('('));
            this.$className = className;
        }
        return this.$className;
    }
}

टेस्ट कोड:

var obj = new AbstractDomainClass();
expect(obj.className()).toBe('AbstractDomainClass');

1

मुझे एक समान समस्या थी और मैंने इसे इस प्रकार हल किया:

Function.prototype.myname = function() {
   return this.toString()
       .substr( 0, this.toString().indexOf( "(" ) )
       .replace( "function ", "" ); 
}

यह कोड एक अधिक आरामदायक फैशन में लागू होता है, एक प्रतिक्रिया जो मैंने पहले ही इस चर्चा के शीर्ष पर यहां पढ़ी है। अब मेरे पास एक सदस्य फ़ंक्शन है जो किसी फ़ंक्शन ऑब्जेक्ट का नाम पुनर्प्राप्त करता है। यहां देखें पूरी स्क्रिप्ट ...

<script language="javascript" TYPE="text/javascript">

    Function.prototype.myname = function() { 
        return this.toString()
            .substr( 0, this.toString().indexOf( "(" ) )
            .replace("function ", "" ); 
    }
    function call_this( _fn ) { document.write( _fn.myname() ); }
    function _yeaaahhh() { /* do something */ }
    call_this( _yeaaahhh ); 

</script>

1

अगर मुझे समझ में आया कि आप क्या करना चाहते हैं, तो यही मैं एक फंक्शन कंस्ट्रक्टर के अंदर करता हूं।

if (!(this instanceof arguments.callee)) {
    throw "ReferenceError: " + arguments.callee.name + " is not defined";
}

2
ध्यान दें: पदावनत किया गया - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Helcio R. Macedo Pandelo

0

यह ईएस 5, ईएस 6, सभी ब्राउज़रों और सख्त मोड फ़ंक्शन में काम करेगा।

यहां एक नामित फ़ंक्शन के साथ कैसा दिखता है।

(function myName() {
  console.log(new Error().stack.split(/\r\n|\r|\n/g)[1].trim());
})();
at myName (<anonymous>:2:15)

यहां यह एक अनाम फ़ंक्शन के साथ कैसा दिखता है।

(() => {
  console.log(new Error().stack.split(/\r\n|\r|\n/g)[1].trim());
})();
at <anonymous>:2:15

यह प्रति ब्राउजर अलग-अलग परिणाम तैयार करता है। क्रोम: at myName (<anonymous>:2:15)फ़ायरफ़ॉक्स:@debugger eval code:3:3
jkdev

(फ़ंक्शन myName () {कंसोल.लॉग (नई त्रुटि) ()। stack.split (/ \ r \ \ _ \ _ \ r | \ n / g) [1] .trim ()। विभाजन ("") [1] ;}) ();
जिब्री

-2

यहां देखें: http://www.tek-tips.com/viewthread.cfm?qid=1209619

arguments.callee.toString();

अपनी आवश्यकताओं के लिए सही प्रतीत होता है।


3
तर्क। cloe.toString () केवल फ़ंक्शन का स्रोत देता है।
स्कॉट कर्लेनबैक

2
अनुमति नहीं है: 'कॉलर', 'कैली' और 'तर्क' के गुणों को सख्त मोड फ़ंक्शंस या उन पर कॉल के लिए तर्क ऑब्जेक्ट तक नहीं पहुँचा जा सकता है
एरिक होडोंस्की

-2

आप फ़ंक्शन नाम और जहाँ आप उसमें हैं, उसकी सही स्थिति का पता लगाने के लिए Error.stack का उपयोग कर सकते हैं।

स्टैकट्रेस देखें। js


-3

आपके द्वारा चलाए जा रहे फ़िक्शन से फ़ंक्शन नाम प्राप्त करने का आसान तरीका।

function x(){alert(this.name)};x()


1
मुझे एक GUID देता है
तामिर डेनियली

1
thisमूल रूप से कुछ भी हो सकता है की सामग्री के बारे में पता होना। कोशिश(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()
वैलेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.