আপনি জাভাস্ক্রিপ্টে কলার ফাংশনটি কীভাবে খুঁজে পাবেন?


865
function main()
{
   Hello();
}

function Hello()
{
  // How do you find out the caller function is 'main'?
}

কল স্ট্যাক খুঁজে বের করার কোনও উপায় আছে?


63
আমি আশা করি এটি কেবল ডিবাগিংয়ে আপনাকে সহায়তা করার জন্য। কলারের উপর ভিত্তি করে বৈচিত্রময় আচরণ একটি খারাপ ধারণা।
ওজে।

এটি কখন ডিবাগিংয়ের জন্য কার্যকর হবে?
অ্যান্ডারসন সবুজ

33
@ অ্যান্ডারসগ্রিন যখন আপনি পেয়েছেন, উদাহরণস্বরূপ, একটি ডিফল্ট টেম্পলেট রেন্ডার পদ্ধতি এবং দেখুন এটি দুটিবার বলা হচ্ছে। ডিওগারটির সাথে হালকা নিয়ন্ত্রণের চাপ দিয়ে বা কষ্টসাধ্য পদক্ষেপের পরিবর্তে, আপনি কেবল দেখতে পারেন যে সেই সময় স্ট্যাকটি কী ছিল।
tkone

28
স্ট্যাক ট্রেস দেখতে ক্রোমের জন্য কনসোল.ট্রেস () ব্যবহার করুন। যদিও অন্যদের সম্পর্কে জানেন না
lukas.pukenis

5
কেন এটি একটি খারাপ ধারণা?
জ্যাকব স্নাইডার

উত্তর:


994
function Hello()
{
    alert("caller is " + Hello.caller);
}

মনে রাখবেন যে এই বৈশিষ্ট্যটি মানহীন , এর থেকে Function.caller:

অ-মানক
এই বৈশিষ্ট্যটি মানহীন এবং মানক ট্র্যাকের নয়। এটি ওয়েবের মুখোমুখি উত্পাদন সাইটগুলিতে ব্যবহার করবেন না: এটি প্রতিটি ব্যবহারকারীর পক্ষে কাজ করবে না। বাস্তবায়ন এবং আচরণের মধ্যে ভবিষ্যতে পরিবর্তিত হতে পারে এর মধ্যে বৃহত অসুবিধাগুলিও থাকতে পারে।


নিম্নলিখিতটি ২০০৮ সালের পুরানো উত্তর, যা আর আধুনিক জাভাস্ক্রিপ্টে সমর্থিত নয়:

function Hello()
{
    alert("caller is " + arguments.callee.caller.toString());
}

254
arguments.callee.caller.nameফাংশনটির নাম পাবেন।
রকেট হাজমাত

137
"'কলার', 'কলি', এবং 'আর্গুমেন্ট' বৈশিষ্ট্যগুলি কঠোর মোড ফাংশনে বা তাদের কাছে কল করার জন্য আর্গুমেন্টের অবজেক্টগুলিতে অ্যাক্সেস পাওয়া যায় না" - এগুলিকে ES5 এ অবমূল্যায়ন করা হয়েছে এবং কঠোর মোডে সরানো হয়েছে।
ThatGuy

12
এটি কেবলমাত্র কার্যকর হবে, যদি আপনি কঠোর মোড ব্যবহার না করেন। সুতরাং অপসারণ 'use strict';সাহায্য করতে পারে।
pvorb

23
argumentsকঠোর মোডে কোনও ফাংশনের মধ্যে থেকে অ্যাক্সেস করা যেতে পারে, এটি হ্রাস করা বোকামি হবে would ঠিক বাইরে থেকে ফাংশন.আরগমেন্টস থেকে নয়। এছাড়াও, যদি আপনার একটি নামযুক্ত আর্গুমেন্ট থাকে তবে এর আর্গুমেন্টগুলি [i] ফর্মটি ফাংশনের অভ্যন্তরে নামকরণকৃত সংস্করণে করা পরিবর্তনগুলি ট্র্যাক করবে না।
rvr_jon

41
এই পোস্টটি ২০১১ সালে তালিকাভুক্ত হওয়ার পরে এই পদ্ধতিটি অচল হয়ে পড়েছে The পছন্দের পদ্ধতিটি এখন Function.caller, (২০১৫ হিসাবে)।
গ্রেগ

152

ক্ষেত্রে স্টেকট্র্যাস

আপনি ব্রাউজার নির্দিষ্ট কোড ব্যবহার করে পুরো স্ট্যাক ট্রেস খুঁজে পেতে পারেন। ভাল জিনিসটি কেউ ইতিমধ্যে এটি তৈরি করেছে ; এখানে GitHub থেকে প্রকল্পের কোড

তবে সমস্ত খবর ভাল নয়:

  1. স্ট্যাকের ট্রেস পাওয়া সত্যিই ধীর, তাই সাবধানতা অবলম্বন করুন (আরও পড়ুন এটি )।

  2. স্ট্যাক ট্রেসটি সুস্পষ্ট হওয়ার জন্য আপনাকে ফাংশনের নামগুলি নির্ধারণ করতে হবে। কারণ আপনার যদি এই জাতীয় কোড থাকে:

    var Klass = function kls() {
       this.Hello = function() { alert(printStackTrace().join('\n\n')); };
    }
    new Klass().Hello();
    

    গুগল ক্রোম সতর্কতা অবলম্বন করবে ... kls.Hello ( ...তবে বেশিরভাগ ব্রাউজারগুলি কীওয়ার্ডের ঠিক পরে কোনও ফাংশনের নাম আশা functionকরবে এবং এটি একটি বেনাম ফাংশন হিসাবে বিবেচনা করবে। এমনকি কোনও Klassক্রোমও যদি নামটি klsফাংশনে না দেয় তবে নামটি ব্যবহার করতে সক্ষম হবে ।

    এবং উপায় দ্বারা, আপনি ফাংশনটি প্রিন্টস্ট্যাকট্রেস বিকল্পটিতে যেতে পারেন {guess: true}তবে আমি এটি করে কোনও বাস্তব উন্নতি পাইনি।

  3. সমস্ত ব্রাউজার আপনাকে একই তথ্য দেয় না। অর্থাৎ প্যারামিটার, কোড কলাম ইত্যাদি


কলার ফাংশন নাম

যাইহোক, আপনি যদি কেবল কলার ফাংশনের নাম চান (বেশিরভাগ ব্রাউজারগুলিতে, তবে আইই নয়) তবে আপনি ব্যবহার করতে পারেন:

arguments.callee.caller.name

তবে মনে রাখবেন functionকীওয়ার্ডের পরে এই নামটিই এক হবে । পুরো ফাংশনের কোড না পেয়ে এর থেকে বেশি পাওয়ার কোনও উপায় (এমনকি গুগল ক্রোমেও) পাইনি।


কলার ফাংশন কোড

এবং বাকী সেরা উত্তরের সংক্ষিপ্তসার (পাবলো ক্যাবেরা, নুরডাইন এবং গ্রেগ হিউগিল দ্বারা)। আপনি ব্যবহার করতে পারেন শুধুমাত্র ক্রস ব্রাউজার এবং সত্যই নিরাপদ জিনিস:

arguments.callee.caller.toString();

যা কলার ফাংশনের কোডটি প্রদর্শন করবে । দুঃখের বিষয়, এটি আমার পক্ষে যথেষ্ট নয় এবং সে কারণেই আমি আপনাকে স্ট্যাকট্রেস এবং কলার ফাংশন নাম (যদিও তারা ক্রস ব্রাউজার নয়) এর জন্য টিপস দিচ্ছি।


1
সম্ভবত আপনি যোগ করা উচিত Function.callerপ্রতি @ গ্রেগ এর উত্তর
জ্যাক Lysobey

Function.callerতবে কঠোর মোডে কাজ করবে না।
রিকার্ড ইলিমি

54

আমি জানি আপনি "জাভাস্ক্রিপ্টে" উল্লেখ করেছেন, তবে উদ্দেশ্যটি যদি ডিবাগ করা হয় তবে আমি মনে করি কেবল আপনার ব্রাউজারের বিকাশকারী সরঞ্জামগুলি ব্যবহার করা আরও সহজ। এটি ক্রোমে কেমন দেখাচ্ছে: এখানে চিত্র বর্ণনা লিখুন আপনি যেখানে স্ট্যাকটি তদন্ত করতে চান ঠিক সেখানে ডিবাগারটি ফেলে দিন।


3
এটি একটি পুরানো প্রশ্ন ... তবে এটি সম্ভবত আজকের এটি করার আধুনিকতম বৈধ উপায়।
মার্কস্টেই

53

পুনরুদ্ধার করতে (এবং এটি আরও পরিষ্কার করা) ...

এই কোড:

function Hello() {
    alert("caller is " + arguments.callee.caller.toString());
}

এর সমতুল্য:

function Hello() {
    alert("caller is " + Hello.caller.toString());
}

স্পষ্টতই প্রথম বিটটি আরও বহনযোগ্য, যেহেতু আপনি ফাংশনটির নাম পরিবর্তন করতে পারেন, "হ্যালো" থেকে "সিওও" তে বলুন, এবং এখনও পুরো জিনিসটি কাজ করতে পারেন।

পরবর্তী ক্ষেত্রে, আপনি যদি অনুরোধ ফাংশনটির নাম (হ্যালো) এর রিফ্যাক্টর স্থির করার সিদ্ধান্ত নেন তবে আপনাকে তার সমস্ত উপস্থিতি পরিবর্তন করতে হবে :(


7
arguments.callee.caller ক্রোম 25.0.1364.5 দেবকে সর্বদা বাতিল করে রাখে
কোকিজু

53

আপনি পুরো স্ট্যাকট্রেস পেতে পারেন:

arguments.callee.caller
arguments.callee.caller.caller
arguments.callee.caller.caller.caller

কলার না হওয়া পর্যন্ত null

দ্রষ্টব্য: এটি পুনরাবৃত্ত ফাংশনগুলিতে একটি অসীম লুপ তৈরি করে cause


2
দেরিতে জবাবের জন্য দুঃখিত তবে আমি আপনার মন্তব্যটি আগে দেখিনি; কেবল পুনরাবৃত্তির ক্ষেত্রে এটি কাজ করে না, অন্যান্য ক্ষেত্রে এটি কাজ করা উচিত।
ale5000

45

আমি সাধারণত (new Error()).stackক্রোমে ব্যবহার করি । সুন্দর জিনিস হ'ল এটি আপনাকে লাইন নম্বর দেয় যেখানে কলার ফাংশন বলে। খারাপ দিকটি এটি স্ট্যাকের দৈর্ঘ্য 10-এ সীমাবদ্ধ করে, এই কারণেই আমি এই পৃষ্ঠায় প্রথম স্থানে এসেছি।

(মৃত্যুদন্ড কার্যকর করার সময় নিম্ন স্তরের কনস্ট্রাক্টরে কলস্ট্যাকগুলি সংগ্রহ করতে, এটি দেখতে এবং পরে ডিবাগ করার জন্য আমি এটি ব্যবহার করছি, তাই ব্রেকপয়েন্ট স্থাপন করা কার্যকর নয় কারণ এটি হাজার হাজার বার আঘাত হানা যাবে)


আপনি যে ব্যাখ্যাটি সরবরাহ করেন সে সম্পর্কে আপনি কি আরও কিছু বিবরণ যুক্ত করতে পারেন?
অ্যারিসোন

6
'use strict';জায়গাটিতে থাকাকালীন আমি এই কাজটি করতে পারি । আমার প্রয়োজনীয় তথ্য আমাকে দিয়েছেন - ধন্যবাদ!
জেরেমি হ্যারিস

4
স্ট্যাকের দৈর্ঘ্যের সীমা সম্পর্কে ... আপনি "ত্রুটি। স্ট্যাকট্রেস লিমিট = ইনফিনিটি" দিয়ে এটি পরিবর্তন করতে পারেন।
টম

(নতুন ত্রুটি ("স্ট্যাকলগ")) st
তেওমান শিপাহি


22

কলিং ফাংশনটি পেতে আপনি Function.Caller ব্যবহার করতে পারেন। আর্গুমেন্টক্লার ব্যবহার করে পুরানো পদ্ধতিটি অচল মনে করা হয়।

নিম্নলিখিত কোডটি এর ব্যবহারকে চিত্রিত করে:

function Hello() { return Hello.caller;}

Hello2 = function NamedFunc() { return NamedFunc.caller; };

function main()
{
   Hello();  //both return main()
   Hello2();
}

অপ্রচলিত আর্গুমেন্ট.ক্যালার সম্পর্কে নোট: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / ফাংশনস / অর্গমেন্টস / ক্যালার

সচেতন থাকুন ফাংশন.ক্যালারটি মানহীন: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ফাংশন / ক্যালার


1
আজকাল এটিই সঠিক উত্তর। আপনি আর আর্গুমেন্টস কলার.ক্যালি স্টাফ করতে পারবেন না। আশা করি আমরা অন্যান্য বিষয়গুলি এখন পুরানো হয়ে যাওয়ার কারণে এটি শীর্ষে উঠতে পারি।
coblr

4
মনে হচ্ছে কড়া মোডে এটি কি সম্ভব নয়? Cannot access caller property of a strict mode function
Zach Lysobey

ফাংশন.ক্যালার আমার পক্ষে কড়া মোডেও কাজ করেনি। এছাড়াও, এমডিএন অনুসারে ফাংশন.ক্যালার মানহীন এবং উত্পাদনে ব্যবহার করা উচিত নয়। যদিও এটি ডিবাগিংয়ের জন্য কাজ করতে পারে।
jkdev

নোডে এটি কাজ করে থাকলে আমার অ-মানক নিয়ে কোনও সমস্যা ছিল না, তবে এটি কেবল কঠোর মোডে অনুমোদিত নয় (আমি নোড 6..১০ এ পরীক্ষিত)। একই 'আর্গুমেন্ট' জন্য প্রযোজ্য। আমি ত্রুটিযুক্ত বার্তা পেয়েছি: '' 'কলার' এবং 'আর্গুমেন্ট' সীমাবদ্ধ ফাংশন বৈশিষ্ট্য এবং এই প্রসঙ্গে অ্যাক্সেস করা যায় না ""
টম

21

আমি এটি করব:

function Hello() {
  console.trace();
}

এটি দুর্দান্ত কাজ করছে! যথাযথ উত্তর হিসাবে গ্রহণ করা উচিত, যেমন অন্যান্য উপায় পুরানো
যুবাল প্রস

19
function Hello() {
    alert(Hello.caller);
}

1
এবং কেবলমাত্র ফাংশন নামের জন্য হ্যালোক্যালার.নাম
ভ্যানভাল

একই হিসাবেarguments.callee.caller.toString()
ব্যবহারকারী 2720864

কমপক্ষে 2016 এর জন্য এটি সঠিক উত্তর হওয়া উচিত
ড্যানিয়েল

এটি কোনও মানদণ্ডের ট্র্যাকের নয়, তবে ECMAScript 5 হিসাবে কাজ করবে
ওবিনা নাওয়াকউয়ে


18

এটা ব্যবহার করা নিরাপদ *arguments.callee.callerযেহেতু arguments.callerহয় অবচিত ...


36
arguments.calleeES5 এ অবমূল্যায়ন করা হয় এবং কঠোর মোডে সরানো হয়।
nyuszika7h

2
বিকল্প আছে? সম্পাদনা: arguments.calleeএমন সমস্যার একটি খারাপ সমাধান ছিল যা এখন উন্নততর সমাধান করা হয়েছে বিকাশকারী.মোজিলা.আর.ইন-
ম্যাথিউ

16

দেখে মনে হচ্ছে এটি বেশ সমাধান করা প্রশ্ন তবে আমি সম্প্রতি জানতে পেরেছি যে ক্যালিকে 'কড়া মোডে' অনুমতি দেওয়া হচ্ছে না তাই আমার নিজের ব্যবহারের জন্য আমি একটি ক্লাস লিখেছিলাম যেখান থেকে এটি ডাকা হবে সেখানেই পথ পাবে। এটি একটি ছোট সহায়ক সহায়তার অংশ এবং আপনি যদি কোডটি স্ট্যান্ডেলোন ব্যবহার করতে চান তবে কলারের স্ট্যাক ট্রেস ফেরত দিতে ব্যবহৃত অফসেটটি পরিবর্তন করতে হবে (২ এর পরিবর্তে 1 ব্যবহার করুন)

function ScriptPath() {
  var scriptPath = '';
  try {
    //Throw an error to generate a stack trace
    throw new Error();
  }
  catch(e) {
    //Split the stack trace into each line
    var stackLines = e.stack.split('\n');
    var callerIndex = 0;
    //Now walk though each line until we find a path reference
    for(var i in stackLines){
      if(!stackLines[i].match(/http[s]?:\/\//)) continue;
      //We skipped all the lines with out an http so we now have a script reference
      //This one is the class constructor, the next is the getScriptPath() call
      //The one after that is the user code requesting the path info (so offset by 2)
      callerIndex = Number(i) + 2;
      break;
    }
    //Now parse the string for each section we want to return
    pathParts = stackLines[callerIndex].match(/((http[s]?:\/\/.+\/)([^\/]+\.js)):/);
  }

  this.fullPath = function() {
    return pathParts[1];
  };

  this.path = function() {
    return pathParts[2];
  };

  this.file = function() {
    return pathParts[3];
  };

  this.fileNoExt = function() {
    var parts = this.file().split('.');
    parts.length = parts.length != 1 ? parts.length - 1 : 1;
    return parts.join('.');
  };
}

function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()কনসোল দিয়ে আমার জন্য কাজ করে না (কোনও ফাইলে চেষ্টা করে দেখেনি), তবে মনে হয় যুক্তিসঙ্গত ধারণা আছে। দৃশ্যমানতার জন্য যাইহোক আপবোট করা উচিত।
নিনজেকেকো

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

এই ফাংশনটি কীভাবে কল করবেন তার একটি উদাহরণ সরবরাহ করুন।
pd_au


11

আপনার ত্রুটি স্ট্যাক লগ কনসোল। তারপরে আপনি জানতে পারবেন কীভাবে আপনাকে ডাকা হচ্ছে

const hello = () => {
  console.log(new Error('I was called').stack)
}

const sello = () => {
  hello()
}

sello()


10

2018 আপডেট

callerকঠোর মোডে নিষিদ্ধ করা হয় । (অ-মানক) Errorস্ট্যাকটি ব্যবহার করে এখানে একটি বিকল্প রয়েছে ।

নিম্নলিখিত ফাংশনটি ফায়ারফক্স ৫২ এবং ক্রোম 61১-71১ এ কাজ করছে বলে মনে হচ্ছে যদিও এর বাস্তবায়ন দুটি ব্রাউজারের লগিং ফর্ম্যাট সম্পর্কে প্রচুর অনুমান করে এবং সাবধানতার সাথে ব্যবহার করা উচিত, এটি একটি ব্যতিক্রম ছুঁড়ে ফেলে এবং সম্ভবত দুটি রেজেক্স কার্যকর করে ম্যাচিং করা হচ্ছে আগে।

'use strict';
const fnNameMatcher = /([^(]+)@|at ([^(]+) \(/;

function fnName(str) {
  const regexResult = fnNameMatcher.exec(str);
  return regexResult[1] || regexResult[2];
}

function log(...messages) {
  const logLines = (new Error().stack).split('\n');
  const callerName = fnName(logLines[1]);

  if (callerName !== null) {
    if (callerName !== 'log') {
      console.log(callerName, 'called log with:', ...messages);
    } else {
      console.log(fnName(logLines[2]), 'called log with:', ...messages);
    }
  } else {
    console.log(...messages);
  }
}

function foo() {
  log('hi', 'there');
}

(function main() {
  foo();
}());


4
এটি অবিশ্বাস্য এবং ভয়াবহও।
আয়ান

আমি "foo বিন্যাস সাথে ডাকা: হাই" পেয়েছিলাম, কিন্তু foo বিন্যাস সঙ্গে "হাই", বলা হয় নি লগ "হাই সেখানে" সঙ্গে বলা হত
AndrewR

ঠিক আছে, ত্রুটির বার্তার ব্যাকরণে একটি "ভুল জায়গায় পরিবর্তিত" ছিল। এর অর্থ হ'ল "ফাংশন এফ থেকে লগ আহ্বান করা হয়েছিল, এটি এক্স মুদ্রিত বার্তাটি চেয়েছিল" তবে যতটা সম্ভব সংক্ষিপ্ত আকারে।
রোভানিওন

9

ES6 এবং কঠোর মোড উভয় ক্ষেত্রে, কলার ফাংশনটি পেতে নিম্নলিখিত ব্যবহার করুন

console.log((new Error()).stack.split("\n")[2].trim().split(" ")[1])

দয়া করে নোট করুন, উপরের লাইনটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, যদি কোনও কলার বা কোনও পূর্ববর্তী স্ট্যাক না থাকে। সেই অনুযায়ী ব্যবহার করুন।


কলি (বর্তমান ফাংশনটির নাম) পেতে, ব্যবহার করুন: console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
ভানাগাস

7

আমি এর জন্য এখানে আমার ফিডল যুক্ত করতে চেয়েছিলাম:

http://jsfiddle.net/bladnman/EhUm3/

আমি এটি ক্রোম, সাফারি এবং আইই (10 এবং 8) পরীক্ষা করেছি। ঠিকভাবে কাজ করে. এখানে কেবল 1 টি ফাংশন রয়েছে যা গুরুত্বপূর্ণ, তাই আপনি যদি বড় মাপসই দ্বারা ভয় পান তবে নীচে পড়ুন।

দ্রষ্টব্য: এই ঝাঁকুনিতে আমার নিজস্ব "বয়লারপ্লেট" মোটামুটি পরিমাণ রয়েছে। আপনি সেগুলি সরাতে পারেন এবং পছন্দ করতে চাইলে স্প্লিট ব্যবহার করতে পারেন। আমি নির্ভর করতে এসেছি এটি কেবলমাত্র একটি অতি-সুরক্ষিত "ফাংশনগুলির সেট।

সেখানে একটি "জেএসফিডাল" টেমপ্লেট রয়েছে যা আমি অনেকগুলি ফিডলকে কেবল দ্রুত ফিডলিংয়ের জন্য ব্যবহার করি।


আমি অবাক হই যদি আপনি কিছু ক্ষেত্রে প্রোটোটাইপের জন্য এক্সটেনশন হিসাবে "সহায়তাকারী" যুক্ত করতে পারেন, উদাহরণস্বরূপ:String.prototype.trim = trim;
অটিস্টিক

6

আপনি যদি কোডটি না দিয়ে কেবল ফাংশনটির নাম চান এবং ব্রাউজার-স্বাধীন সমাধান চান তবে নিম্নলিখিতটি ব্যবহার করুন:

var callerFunction = arguments.callee.caller.toString().match(/function ([^\(]+)/)[1];

নোট করুন যে অ্যারেতে কোনও [1] উপাদান না থাকায় কলার ফাংশন না থাকলে উপরেরগুলি ত্রুটি ফিরিয়ে দেবে। চারপাশে কাজ করতে, নীচেরটি ব্যবহার করুন:

var callerFunction = (arguments.callee.caller.toString().match(/function ([^\(]+)/) === null) ? 'Document Object Model': arguments.callee.caller.toString().match(/function ([^\(]+)/)[1], arguments.callee.toString().match(/function ([^\(]+)/)[1]);


5

কেবল আপনাকে জানাতে চাই যে ফোনগ্যাপ / অ্যান্ড্রয়েডে এটি nameকাজ করছে বলে মনে হচ্ছে না। তবে arguments.callee.caller.toString()কৌতুক করবে।


4

এখানে, রেজিএক্সপ্যাকের সাথে বাদে সমস্ত functionnameকিছু ছিনিয়ে নেওয়া হয়েছে caller.toString()

<!DOCTYPE html>
<meta charset="UTF-8">
<title>Show the callers name</title><!-- This validates as html5! -->
<script>
main();
function main() { Hello(); }
function Hello(){
  var name = Hello.caller.toString().replace(/\s\([^#]+$|^[^\s]+\s/g,'');
  name = name.replace(/\s/g,'');
  if ( typeof window[name] !== 'function' )
    alert ("sorry, the type of "+name+" is "+ typeof window[name]);
  else
    alert ("The name of the "+typeof window[name]+" that called is "+name);
}
</script>

এটি এখনও পুরো পদ্ধতির ঘোষণাটি ফিরিয়ে দিচ্ছে
মাসলো


3

হেস্টওয়ার্টের উত্তর এবং জিয়ারংউউ এর উত্তর উভয়ই উল্লেখ করেছে যে Errorবস্তুর প্রবেশাধিকার রয়েছে stack

এখানে একটি উদাহরণ:

function main() {
  Hello();
}

function Hello() {
  var stack;
  try {
    throw new Error();
  } catch (e) {
    stack = e.stack;
  }
  // N.B. stack === "Error\n  at Hello ...\n  at main ... \n...."
  var m = stack.match(/.*?Hello.*?\n(.*?)\n/);
  if (m) {
    var caller_name = m[1];
    console.log("Caller is:", caller_name)
  }
}

main();

বিভিন্ন ব্রাউজার বিভিন্ন স্ট্রিং ফর্ম্যাটে স্ট্যাকটি দেখায়:

Safari : Caller is: main@https://stacksnippets.net/js:14:8 Firefox : Caller is: main@https://stacksnippets.net/js:14:3 Chrome : Caller is: at main (https://stacksnippets.net/js:14:3) IE Edge : Caller is: at main (https://stacksnippets.net/js:14:3) IE : Caller is: at main (https://stacksnippets.net/js:14:3)

বেশিরভাগ ব্রাউজারগুলি স্ট্যাকটি সেট করবে var stack = (new Error()).stack। ইন্টারনেট এক্সপ্লোরারে স্ট্যাকটি অপরিশোধিত হবে - স্ট্যাকটি পুনরুদ্ধার করতে আপনাকে একটি সত্য ব্যতিক্রম ছুঁড়ে ফেলতে হবে।

উপসংহার: "প্রধান" নির্ধারণ করা সম্ভব বস্তুর stackমধ্যে "হ্যালো" কলকারী ler Errorপ্রকৃতপক্ষে এটি সেই ক্ষেত্রে কাজ করবে যেখানে callee/ callerপদ্ধতির কাজ করে না। এটি আপনাকে প্রসঙ্গটি, উত্স ফাইল এবং লাইন নম্বরও প্রদর্শন করবে। তবে সমাধান ক্রস প্ল্যাটফর্মটি করার জন্য প্রচেষ্টা প্রয়োজন।


2

দ্রষ্টব্য আপনি নোড.জেজে Function.caller ব্যবহার করতে পারবেন না , পরিবর্তে কলার-আইডি প্যাকেজটি ব্যবহার করুন। উদাহরণ স্বরূপ:

var callerId = require('caller-id');

function foo() {
    bar();
}
function bar() {
    var caller = callerId.getData();
    /*
    caller = {
        typeName: 'Object',
        functionName: 'foo',
        filePath: '/path/of/this/file.js',
        lineNumber: 5,
        topLevelFlag: true,
        nativeFlag: false,
        evalFlag: false
    }
    */
}

1

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

function getStackTrace(){
  var f = arguments.callee;
  var ret = [];
  var item = {};
  var iter = 0;

  while ( f = f.caller ){
      // Initialize
    item = {
      name: f.name || null,
      args: [], // Empty array = no arguments passed
      callback: f
    };

      // Function arguments
    if ( f.arguments ){
      for ( iter = 0; iter<f.arguments.length; iter++ ){
        item.args[iter] = f.arguments[iter];
      }
    } else {
      item.args = null; // null = argument listing not supported
    }

    ret.push( item );
  }
  return ret;
}

ফায়ারফক্স -21 এবং ক্রোমিয়াম -25 এ আমার জন্য কাজ করেছেন।


পুনরাবৃত্তি ফাংশন জন্য এটি চেষ্টা করুন।
daniel1426


1

এই সমস্যার চারপাশে অন্য উপায় হ'ল পরামিতি হিসাবে কলিং ফাংশনের নামটি কেবল পাস করা।

উদাহরণ স্বরূপ:

function reformatString(string, callerName) {

    if (callerName === "uid") {
        string = string.toUpperCase();
    }

    return string;
}

এখন, আপনি এইভাবে ফাংশনটি কল করতে পারেন:

function uid(){
    var myString = "apples";

    reformatString(myString, function.name);
}

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


আমি বিশ্বাস করি এটি বেশিরভাগ ক্ষেত্রে ক্রস ব্রাউজারের সামঞ্জস্য সমস্যাগুলিও সমাধান করে। তবে দয়া করে এটি সত্য বলে ধরে নেওয়ার আগে এটি পরীক্ষা করুন! ( ঘামতে শুরু করে )
গ্রেডফক্স

1

যতদূর আমি জানি, আমাদের কাছে এর মতো প্রদত্ত উত্স থেকে 2 টি উপায় রয়েছে-

  1. arguments.caller

    function whoCalled()
    {
        if (arguments.caller == null)
           console.log('I was called from the global scope.');
        else
           console.log(arguments.caller + ' called me!');
    }
  2. Function.caller

    function myFunc()
    {
       if (myFunc.caller == null) {
          return 'The function was called from the top!';
       }
       else
       {
          return 'This function\'s caller was ' + myFunc.caller;
        }
    }

আপনার উত্তর আছে মনে করুন :)।


এটি বহু বছর ধরে অবহেলা করা হয়েছে এবং Function.caller কঠোর মোডে কাজ করে না।
ড্যান ড্যাসক্লেস্কু

1

উপরের সমস্ত সমাধান কেন রকেট বিজ্ঞানের মতো দেখাচ্ছে। এদিকে, এই স্নিপেটের চেয়ে বেশি জটিল হওয়া উচিত নয়। এই লোকটির সমস্ত ক্রেডিট

আপনি জাভাস্ক্রিপ্টে কলার ফাংশনটি কীভাবে খুঁজে পাবেন?

var stackTrace = function() {

    var calls = [];
    var caller = arguments.callee.caller;

    for (var k = 0; k < 10; k++) {
        if (caller) {
            calls.push(caller);
            caller = caller.caller;
        }
    }

    return calls;
};

// when I call this inside specific method I see list of references to source method, obviously, I can add toString() to each call to see only function's content
// [function(), function(data), function(res), function(l), function(a, c), x(a, b, c, d), function(c, e)]

3
আমি এটি ব্যবহার করে যা পাই তা হ'ল: টাইপ এরির: 'কলার', 'কলি', এবং 'আর্গুমেন্ট' বৈশিষ্ট্যগুলি কড়া মোড ফাংশনে বা তাদের কলগুলির জন্য আর্গুমেন্ট অবজেক্টে অ্যাক্সেস করা যায় না। কোনও ধারণা কীভাবে এটি কঠোর মোডে কাজ করবেন?
سخت_কাজ_কাল

1

আমি এই প্রশ্নটি দিয়ে প্রশ্ন এবং বর্তমান অনুগ্রহ উভয়কেই সম্বোধন করার চেষ্টা করছি।

অনুগ্রহকারীটির প্রয়োজন হয় যে কলারটি কঠোর মোডে নেওয়া উচিত এবং আমি এটি সম্পন্ন দেখতে পাবার একমাত্র উপায় হ'ল কঠোর মোডের বাইরে ঘোষিত কোনও ফাংশন উল্লেখ করে।

উদাহরণস্বরূপ, নিম্নলিখিতটি মানহীন তবে এর পূর্ববর্তী (29/03/2016) এবং বর্তমান (1 আগস্ট 2018) ক্রোম, এজ এবং ফায়ারফক্সের সংস্করণগুলির সাথে পরীক্ষা করা হয়েছে।

function caller()
{
   return caller.caller.caller;
}

'use strict';
function main()
{
   // Original question:
   Hello();
   // Bounty question:
   (function() { console.log('Anonymous function called by ' + caller().name); })();
}

function Hello()
{
   // How do you find out the caller function is 'main'?
   console.log('Hello called by ' + caller().name);
}

main();



0

আপনার যদি সত্যিই কোনও কারণে কার্যকারিতা প্রয়োজন হয় এবং এটি ক্রস ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ হতে চান এবং কঠোর স্টাফের জন্য চিন্তা না করে এবং সামনের দিকে সামঞ্জস্যপূর্ণ হন তবে এই রেফারেন্সটি পাস করুন:

function main()
{
   Hello(this);
}

function Hello(caller)
{
    // caller will be the object that called Hello. boom like that... 
    // you can add an undefined check code if the function Hello 
    // will be called without parameters from somewhere else
}

0

আমি মনে করি যে নিম্নলিখিত কোড অংশটি সহায়ক হতে পারে:

window.fnPureLog = function(sStatement, anyVariable) {
    if (arguments.length < 1) { 
        throw new Error('Arguments sStatement and anyVariable are expected'); 
    }
    if (typeof sStatement !== 'string') { 
        throw new Error('The type of sStatement is not match, please use string');
    }
    var oCallStackTrack = new Error();
    console.log(oCallStackTrack.stack.replace('Error', 'Call Stack:'), '\n' + sStatement + ':', anyVariable);
}

কোডটি কার্যকর করুন:

window.fnPureLog = function(sStatement, anyVariable) {
    if (arguments.length < 1) { 
        throw new Error('Arguments sStatement and anyVariable are expected'); 
    }
    if (typeof sStatement !== 'string') { 
        throw new Error('The type of sStatement is not match, please use string');
    }
    var oCallStackTrack = new Error();
    console.log(oCallStackTrack.stack.replace('Error', 'Call Stack:'), '\n' + sStatement + ':', anyVariable);
}

function fnBsnCallStack1() {
    fnPureLog('Stock Count', 100)
}

function fnBsnCallStack2() {
    fnBsnCallStack1()
}

fnBsnCallStack2();

লগটি এই মত দেখাচ্ছে:

Call Stack:
    at window.fnPureLog (<anonymous>:8:27)
    at fnBsnCallStack1 (<anonymous>:13:5)
    at fnBsnCallStack2 (<anonymous>:17:5)
    at <anonymous>:20:1 
Stock Count: 100
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.