কিভাবে এই ফাংশন থেকে ফাংশন নাম পেতে?


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();

ভাল, পিতামাতায়, আমি তখন কনভেনশন দ্বারা অন্যান্য ক্রিয়াকলাপগুলি যেমন এনএস [চাইল্ড] [স্কিমা] বা এনএস [চাইল্ড] [ডিবি সার্ভিস] দ্বারা অ্যাক্সেস করতে পারি। এটি ছাড়া, আমাকে প্রতিটি শিশু শ্রেণিতে এই তথ্যগুলি হার্ড কোড করতে হবে।
স্কট ক্লেরেনবাচ

সন্তানের ক্রিয়াকলাপটি কেবল পিতামাতার পক্ষে যুক্তি হিসাবে কেন পাস করবেন না? var पालक = নতুন এনএস.পিতা (এটি);
plodder

কারণ এমন কয়েক ডজন চেহারা এবং কয়েক ডজন শিশু রয়েছে। এটি বর্তমানে আমি যা করছি তা কিন্তু এটি প্রতিবারের মতো একই এবং সঠিক হয় যদি সেই ডুপ্লিকেট যুক্তিটি উত্পন্ন ফাংশনের উপর ভিত্তি করে কেবল একবার পিতামাতার ভিতরে রাখা যায়।
স্কট ক্লেরেনবাচ

দেখুন, এটি আমি চাই এমন শিশু ফাংশন নয়, এটি নামকরণ কনভেনশন ব্যবহৃত হয়, কারণ সেই নামকরণ কনভেনশনটি অন্যান্য ক্রিয়াকলাপগুলি লোড করতে ব্যবহার করা যেতে পারে যা বর্তমানে শিশু বস্তুর উপরে সংজ্ঞায়িত নয়, তবে পুরো সিস্টেম জুড়েই এই সন্তানের সাথে সম্পর্কিত।
স্কট ক্লেরেনবাচ

1
@ স্কট আমি অন্য সবার সাথে একমত, আপনার জটিলতা এবং কোড কাঠামোকে পরিচালনা করার জন্য এটি করা দরকার wrong এই জাতীয় হার্ড-কাপলিং একটি খারাপ ডিজাইনের সিদ্ধান্ত এবং একটি গোলযোগ তৈরি করতে চলেছে। @ সিমভিদাস আপনার দুর্দান্ত নেক্রোম্যান্সার :)
রায়নস

উত্তর:


163

ইএস 5-তে, সর্বোত্তম কাজটি হ'ল:

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উভয়ই কঠোর মোডে নিষিদ্ধ।

সম্পাদনা করুন: নীচের গ্রাহকের রেজেক্স ভিত্তিক উত্তর একই জিনিস অর্জন করে, তবে আরও ভাল পারফরম্যান্স রয়েছে!

ES6 এ, আপনি কেবল ব্যবহার করতে পারেন myFunction.name

দ্রষ্টব্য: সাবধান হন যে কিছু জেএস মিনিফায়ারগুলি আরও ভাল সংকোচনের জন্য ফাংশনের নামগুলি ফেলে দিতে পারে; এটি এড়াতে আপনার সেটিংগুলি টুইট করতে হবে।


যদিও এটি আমার পক্ষে প্রশ্নের উত্তরটি যথেষ্ট পরিমাণে দেয়নি (বেনামে ফাংশনগুলির কারণে), এটি আমাকে এই কাজটি করার জন্য ধারণা দিয়েছে: fun.toString().substr(0, 100)যা আমার প্রয়োজনের জন্য প্রশ্নের ক্রিয়াকলাপটি সনাক্ত করার জন্য যথেষ্ট হবে। সুতরাং, অনুপ্রেরণার জন্য ধন্যবাদ!
ক্যাম্পবেল

3
ইএস 6-এ myFunction.nameকরা সবচেয়ে ভাল কাজ।
ভ্লাদ এ আওনস্কু

15
আপনি myFunction.nameযদি ফাংশনটির নাম টাইপ করেন তবে তাতে কী লাভ ? যাদু ভেরিয়েবলের উদ্দেশ্যকে পরাস্ত করে।
adi518

2
@ adi518: অগত্যা নয় .. মনে করুন আপনার কোনও ফাংশন রয়েছে এবং আপনি তার উপর / foreach ব্যবহার করে পুনরাবৃত্তি করছেন .. arr[index].nameতবে এটিও কাজ করবে :)
দেবাশীষ চৌধুরী

2
@ adi518 এটি অকেজো নয়। আমি যদি আমার আইডিই এর মধ্যে ফাংশনটির নাম পরিবর্তন করি তবে myFunction.nameতাও আপডেট হবে। অবশ্যই, ইন্টেলিজি স্ট্রিংগুলির মধ্যে নতুন নামকরণকারীদের সমর্থন করে, তবে এটি অনেক কম ধারাবাহিকভাবে কাজ করে এবং যদি কেউ "স্ট্রিং ইন অনুসন্ধান" বিকল্পটি টিকিয়ে রাখতে ভুলে যায় তবে নিঃশব্দে পুরানো হয়ে যাবে। myFunction.nameস্ট্রিং হার্ডকডিংয়ের চেয়ে কিছুটা ভাল পছন্দ।
বাইসোর

141

ES6 (নীচে সেন্ডী হালিমের উত্তর দ্বারা অনুপ্রাণিত):

myFunction.name

এমডিএন-তে ব্যাখ্যা । 2015 পর্যন্ত নোডেজ এবং আইই ব্যতীত সমস্ত বড় ব্রাউজারগুলিতে কাজ করে।

দ্রষ্টব্য: আবদ্ধ ফাংশনগুলিতে এটি " 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অবচয় বলে বিবেচিত হয়।

[1] আমি এটিকে এখানে অন্তর্ভুক্ত করছি কারণ এটি আইনী এবং প্রায়শই পর্যাপ্ত সিনট্যাক্স হাইলাইটিং সরঞ্জামগুলি ফাংশনটির নাম এবং প্রথম বন্ধনের মধ্যবর্তী সাদা স্থানটিকে বিবেচনায় নিতে ব্যর্থ হয়। অন্যদিকে, আমি .toString () এর কোনও প্রয়োগের বিষয়ে অবগত নই যা এখানে সাদা স্থান অন্তর্ভুক্ত করবে, তাই আপনি এটিকে বাদ দিতে পারেন।


মূল প্রশ্নের উত্তর হিসাবে, আমি পরজীবী উত্তরাধিকারটি ছেড়ে দেব এবং আরও কিছু traditionalতিহ্যবাহী ওওপি ডিজাইনের নিদর্শনগুলিতে যাব। সি ++ (এখনও সম্পূর্ণ নয়, তবে বেশিরভাগই) একটি বৈশিষ্ট্য সেট সহ জাভাস্ক্রিপ্টে আরামে ওওপি কোড লিখতে আমি একটি টিডবিটস লিখেছিলাম oওজেজে

আমি মন্তব্যগুলি দেখতে পাচ্ছি যা আপনি তথ্য প্রেরণ এড়াতে চান parent এটির নির্মাণকারীর কাছে প্রয়োজনীয় । আমার অবশ্যই স্বীকার করতে হবে যে traditionalতিহ্যবাহী নকশার ধরণগুলি আপনাকে সেই থেকে রক্ষা করবে না, কারণ আপনার নির্ভরতাগুলি সুস্পষ্ট এবং প্রয়োগ করার জন্য এটি সাধারণত একটি ভাল জিনিস হিসাবে বিবেচিত হয়।

আমি বেনামে ফাংশন থেকে দূরে থাকার পরামর্শ দিতে হবে। তারা কেবল পিটাকে ডিবাগিং এবং প্রোফাইলিং করে কারণ সবকিছু "বেনামে ফাংশন" হিসাবে দেখায় এবং তাদের কোনও লাভ নেই যা সম্পর্কে আমি সচেতন।


3
ভাল রেগেক্স! এখানে এমন একটি পারফরম্যান্স পরীক্ষা যা দেখায় যে আপনার কোড অনেক ক্ষেত্রেই দ্রুত। সাধারণভাবে মনে হয় যে RegEx এখানে গড়ে প্রায় 2x গতিতে দেশীয় জেএসকে পরাজিত করে। jsperf.com/get-function-name/2
বিঘোর

@ টমাসজ হাই, এটি নির্দেশ করার জন্য ধন্যবাদ। আমি এটা জানতাম না। একটি আবদ্ধ ফাংশন আসলে একটি নতুন ফাংশন যা আপনার আসল ফাংশনটি মোড় করে। বাস্তু স্ক্রিপ্ট মান § 19.2.3.2 সংজ্ঞা দেয় যে নতুন ফাংশনের নামটি "আবদ্ধ" + আসল নাম হবে। টোস্ট্রিং পদ্ধতি বাউন্ড ফাংশনগুলিতে কাজ করবে না ... আপনাকে শব্দটি আবদ্ধ করতে হবে।

আপনি যদি ফাংশনটির নামটি টাইপ করেন তবে আমার ফাংশন.নেমে পয়েন্টটি কী? যাদু ভেরিয়েবলের উদ্দেশ্যকে পরাস্ত করে।
বোরজভস্কি

মনে রাখবেন যে আপনি যদি রিএটিভ নেটিভ ব্যবহার করেন তবে এটি সঠিকভাবে কাজ করতে পারে না। আমার কাছে একটি আরএন প্রকল্প রয়েছে যার সাথে আমি এক্সপো সংস্করণ 36 নিয়ে কাজ করছি এবং একটি উপাদান পদ্ধতির .nameসম্পত্তি স্ট্রিংটিকে "মান" হিসাবে দেখাচ্ছিল, এটি যাই বলা হোক না কেন। অদ্ভুতভাবে যথেষ্ট, এক্সপো অ্যাপ্লিকেশনটিতে পরীক্ষার সময় এটি ঠিক ছিল, তবে একবার বাস্তব প্রয়োগের মধ্যে সংকলিত হয়ে গেলে এটি নিঃশব্দে ক্র্যাশ হয়ে যায়।
অ্যান্ডি Corman

64

আপনি যা করছেন তা হল একটি ভেরিয়েবলের নামহীন ফাংশন বরাদ্দ করা। পরিবর্তে আপনার সম্ভবত নামের ফাংশন এক্সপ্রেশন প্রয়োজন ( http://kangax.github.com/nfe/ )।

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

তবে আমি নিশ্চিত না যে ক্রস ব্রাউজারটি কতটা; আই 6 এর সাথে একটি সমস্যা রয়েছে যা আপনাকে ফাংশনের নামটি বহিরাগত স্কোপে ফাঁস করে দেয়। এছাড়াও, আর্গুমেন্টস.ক্যালি একপ্রকার অবচিত হ'ল এবং যদি আপনি ব্যবহার করছেন তবে ত্রুটির ফলস্বরূপ 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:
এখানে চিত্র বর্ণনা লিখুন

এই সমাধানটি কেবল মজাদার জন্য তৈরি করা হয়েছিল ! বাস্তব প্রকল্পগুলির জন্য এটি ব্যবহার করবেন না। এটি ES নির্দিষ্টকরণের উপর নির্ভর করে না, এটি কেবল ব্রাউজার উপলব্ধির উপর নির্ভর করে। পরবর্তী ক্রোম / ফায়ারফক্স / সাফারি আপডেটের পরে এটি নষ্ট হয়ে যেতে পারে।
এর চেয়ে বেশি কোনও ত্রুটি (হেক্টর) প্রক্রিয়াজাতকরণ নেই - যদি dস্ট্যাকের দৈর্ঘ্যের চেয়ে বেশি হয় - আপনি একটি ত্রুটি পাবেন;
অন্যান্য ব্রাউজারগুলির ত্রুটির বার্তাগুলির প্যাটার্নের জন্য - আপনি একটি ত্রুটি পাবেন;
এটি অবশ্যই ES6 ক্লাসের জন্য কাজ করবে ( .split('.').pop()), তবে আপনি একটি ইরির পেতে পারেন;


13

এটি আপনার পক্ষে কাজ করতে পারে:

function foo() { bar(); }

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

চলমান foo () আপনাকে কোনও বেনামি ফাংশন থেকে কল দিলে "foo" আউটপুট বা সংজ্ঞায়িত হবে।

এটি কনস্ট্রাক্টরের সাথেও কাজ করে, এক্ষেত্রে এটি কলিং কনস্ট্রাক্টরের নাম আউটপুট করে (যেমন "ফু")।

এখানে আরও তথ্য: https://developer.mozilla.org/en/JavaScript/ উল্লেখ / গ্লোবাল_অবজেক্টস / ফাংশন / কলার

তারা দাবি করে যে এটি মান -হীন নয়, তবে এটি সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত: ফায়ারফক্স, সাফারি, ক্রোম, অপেরা এবং আইই।


কঠোর মোডে উপলভ্য নয় ... মিমি
কা মোক

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
'এটি' হ'ল সেই ফাংশনটির অনুরোধ জানানো হবে। সুতরাং আপনি যদি প্যারেন্ট ফাংশনের অভ্যন্তরে 'এটি' করেন যা আপনাকে ফাংশনটির উদাহরণ দেয় the আপনার কেবল এটিই দরকার - আপনার নামটির কেন প্রয়োজন তাও নিশ্চিত নন
প্লডডার

1
ভাল, পিতামাতায়, আমি তখন কনভেনশন দ্বারা অন্যান্য ক্রিয়াকলাপগুলি যেমন এনএস [চাইল্ড] [স্কিমা] বা এনএস [চাইল্ড] [ডিবি সার্ভিস] দ্বারা অ্যাক্সেস করতে পারি। এটি ছাড়া, আমাকে প্রতিটি শিশু শ্রেণিতে এই তথ্যগুলি হার্ড কোড করতে হবে।
স্কট ক্লারেনবাচ

1
নামটি সন্ধানের জন্য আমার ব্যবহারের ক্ষেত্রটি কনসোলটি তৈরি করার পক্ষে সহজ করা erঅরর বার্তা যা স্ট্যাকের ডাম্পে ফিরে না গিয়ে বার্তাটি এসেছে তা জানিয়ে দেয়। যেমন কনসোল.অরর (error 'ত্রুটি': {স্ব.নাম উল্লেখ} + "ইনপুট প্যারামিটারের সাথে ত্রুটি")) ত্রুটি বার্তাগুলি কাটা / পেস্ট করা অনেক সহজ হয়ে যায় যা একাধিক ফাংশনগুলিতে পুনরাবৃত্তি করে যদি আপনি প্রতিবার তাদের মধ্যে পাঠ্য থামাতে বা পরিবর্তন করতে না চান। আমার ক্ষেত্রে, আমি একাধিক প্রতিশ্রুতি কলগুলি থেকে প্রতিশ্রুতি ত্রুটিগুলি ফিরিয়ে দিচ্ছি - কোন প্রতিশ্রুতি / ক্রিয়াকলাপটি ত্রুটিটি সৃষ্টি করেছিল তা জেনে ভাল।
স্কট

7

আপনি এটি ব্যবহার করতে পারেন, ত্রুটি.স্ট্যাক সমর্থনকারী ব্রাউজারগুলির জন্য (প্রায় সবই নয়, সম্ভবত)

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

অবশ্যই এটি বর্তমান ফাংশনের জন্য, তবে আপনি ধারণাটি পাবেন get

আপনার কোড করার সময় খুশি


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()

4

আপনি যেমন কনস্ট্রাক্টরের নাম ব্যবহার করতে পারেন:

{your_function}.prototype.constructor.name

এই কোডটি কেবল কোনও পদ্ধতির নাম ফেরত দেয়।


3

অংশ হিসাবে ECMAScript 6আপনি Function.name পদ্ধতি ব্যবহার করতে পারেন

function doSomething() {}

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

রিঅ্যাক্টজেএসে আপনাকে এটি যুক্ত করতে হবে: কনসোল.লগ (this.doSomething.name);
বিকটলা

2
এটি ফাংশনের বাইরে
স্কট ২

3

আপনি ব্যবহার করতে পারেনFunction.name :

জাভাস্ক্রিপ্টের বেশিরভাগ বাস্তবায়নে আপনার কন্সট্রাক্টরের রেফারেন্সটি সুযোগের পরে আপনি তার স্ট্রিংয়ের নামটি তার নামের সম্পত্তি থেকে (উদাহরণস্বরূপ ফাংশন.নাম, বা অবজেক্টস কনস্ট্রাক্টর.নাম) থেকে পেতে পারেন

আপনি ব্যবহার করতে পারেনFunction.callee :

নেটিভ arguments.callerপদ্ধতিটি অবমুক্ত করা হয়েছে, তবে বেশিরভাগ ব্রাউজার সমর্থন করে Function.caller, যা আসল ইনভোকেজ অবজেক্ট (তার কোডের মূল অংশ) ফিরিয়ে দেবে: https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Global_Objects/ ফাংশন / আহ্বায়ক? redirectlocale = স্বীকারোক্তি-মার্কিন ও 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
দ্রষ্টব্য:
হ্রাস করা

0

এটি ES5, ES6, সমস্ত ব্রাউজার এবং কঠোর মোড ফাংশনে কাজ করবে।

এটি একটি নামযুক্ত ফাংশনটির সাথে দেখতে কেমন তা এখানে রয়েছে।

(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
জেকদেব

(ফাংশন myName () {কনসোল.লগ (নতুন ত্রুটি ()। স্ট্যাক.স্প্লিট (/ \ r \ n | \ r | \ n / g) [1]। ট্রাইম ()। বিভক্ত ("") [1]) ;}) ();
জিব্রি

-2

এখানে দেখুন: http://www.tek-tips.com/viewthread.cfm?qid=1209619

arguments.callee.toString();

আপনার প্রয়োজনের জন্য সঠিক বলে মনে হচ্ছে।


3
arguments.callee.toString () সবেমাত্র ফাংশনের উত্স প্রদান করে।
স্কট ক্লেরেনবাচ

2
অনুমোদিত নয়: 'কলার', 'কলি', এবং 'আর্গুমেন্ট' বৈশিষ্ট্যগুলি কঠোর মোড ফাংশনে বা তাদের কলগুলির জন্য আর্গুমেন্টের জিনিসগুলিতে অ্যাক্সেস করা যাবে না
এরিক হোডনস্কি

-2

ফাংশনটির নাম এবং আপনি যেখানে রয়েছেন তার সঠিক অবস্থান সনাক্ত করতে আপনি ত্রুটি.স্ট্যাক ব্যবহার করতে পারেন।

Stacktrace.js দেখুন


-3

আপনি যে চালাচ্ছেন তার মধ্যে ফাংশন নাম পাওয়ার সহজ উপায়।

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


1
আমাকে একটি জিইউডি দেয়
তামির ড্যানিয়েলি

1
thisমূলত এর বিষয়বস্তু সম্পর্কে সচেতন থাকুন যে কোনও কিছু হতে পারে। চেষ্টা করুন(function(){console.log(this.name);}).bind({name: "put basically anything here even an object maybe a 1TB string maybe a class definition"})()
ভ্যালেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.