function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
কল স্ট্যাক খুঁজে বের করার কোনও উপায় আছে?
function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
কল স্ট্যাক খুঁজে বের করার কোনও উপায় আছে?
উত্তর:
function Hello()
{
alert("caller is " + Hello.caller);
}
মনে রাখবেন যে এই বৈশিষ্ট্যটি মানহীন , এর থেকে Function.caller
:
অ-মানক
এই বৈশিষ্ট্যটি মানহীন এবং মানক ট্র্যাকের নয়। এটি ওয়েবের মুখোমুখি উত্পাদন সাইটগুলিতে ব্যবহার করবেন না: এটি প্রতিটি ব্যবহারকারীর পক্ষে কাজ করবে না। বাস্তবায়ন এবং আচরণের মধ্যে ভবিষ্যতে পরিবর্তিত হতে পারে এর মধ্যে বৃহত অসুবিধাগুলিও থাকতে পারে।
নিম্নলিখিতটি ২০০৮ সালের পুরানো উত্তর, যা আর আধুনিক জাভাস্ক্রিপ্টে সমর্থিত নয়:
function Hello()
{
alert("caller is " + arguments.callee.caller.toString());
}
arguments.callee.caller.name
ফাংশনটির নাম পাবেন।
'use strict';
সাহায্য করতে পারে।
arguments
কঠোর মোডে কোনও ফাংশনের মধ্যে থেকে অ্যাক্সেস করা যেতে পারে, এটি হ্রাস করা বোকামি হবে would ঠিক বাইরে থেকে ফাংশন.আরগমেন্টস থেকে নয়। এছাড়াও, যদি আপনার একটি নামযুক্ত আর্গুমেন্ট থাকে তবে এর আর্গুমেন্টগুলি [i] ফর্মটি ফাংশনের অভ্যন্তরে নামকরণকৃত সংস্করণে করা পরিবর্তনগুলি ট্র্যাক করবে না।
আপনি ব্রাউজার নির্দিষ্ট কোড ব্যবহার করে পুরো স্ট্যাক ট্রেস খুঁজে পেতে পারেন। ভাল জিনিসটি কেউ ইতিমধ্যে এটি তৈরি করেছে ; এখানে GitHub থেকে প্রকল্পের কোড ।
তবে সমস্ত খবর ভাল নয়:
স্ট্যাকের ট্রেস পাওয়া সত্যিই ধীর, তাই সাবধানতা অবলম্বন করুন (আরও পড়ুন এটি )।
স্ট্যাক ট্রেসটি সুস্পষ্ট হওয়ার জন্য আপনাকে ফাংশনের নামগুলি নির্ধারণ করতে হবে। কারণ আপনার যদি এই জাতীয় কোড থাকে:
var Klass = function kls() {
this.Hello = function() { alert(printStackTrace().join('\n\n')); };
}
new Klass().Hello();
গুগল ক্রোম সতর্কতা অবলম্বন করবে ... kls.Hello ( ...
তবে বেশিরভাগ ব্রাউজারগুলি কীওয়ার্ডের ঠিক পরে কোনও ফাংশনের নাম আশা function
করবে এবং এটি একটি বেনাম ফাংশন হিসাবে বিবেচনা করবে। এমনকি কোনও Klass
ক্রোমও যদি নামটি kls
ফাংশনে না দেয় তবে নামটি ব্যবহার করতে সক্ষম হবে ।
এবং উপায় দ্বারা, আপনি ফাংশনটি প্রিন্টস্ট্যাকট্রেস বিকল্পটিতে যেতে পারেন {guess: true}
তবে আমি এটি করে কোনও বাস্তব উন্নতি পাইনি।
সমস্ত ব্রাউজার আপনাকে একই তথ্য দেয় না। অর্থাৎ প্যারামিটার, কোড কলাম ইত্যাদি
যাইহোক, আপনি যদি কেবল কলার ফাংশনের নাম চান (বেশিরভাগ ব্রাউজারগুলিতে, তবে আইই নয়) তবে আপনি ব্যবহার করতে পারেন:
arguments.callee.caller.name
তবে মনে রাখবেন function
কীওয়ার্ডের পরে এই নামটিই এক হবে । পুরো ফাংশনের কোড না পেয়ে এর থেকে বেশি পাওয়ার কোনও উপায় (এমনকি গুগল ক্রোমেও) পাইনি।
এবং বাকী সেরা উত্তরের সংক্ষিপ্তসার (পাবলো ক্যাবেরা, নুরডাইন এবং গ্রেগ হিউগিল দ্বারা)। আপনি ব্যবহার করতে পারেন শুধুমাত্র ক্রস ব্রাউজার এবং সত্যই নিরাপদ জিনিস:
arguments.callee.caller.toString();
যা কলার ফাংশনের কোডটি প্রদর্শন করবে । দুঃখের বিষয়, এটি আমার পক্ষে যথেষ্ট নয় এবং সে কারণেই আমি আপনাকে স্ট্যাকট্রেস এবং কলার ফাংশন নাম (যদিও তারা ক্রস ব্রাউজার নয়) এর জন্য টিপস দিচ্ছি।
Function.caller
প্রতি @ গ্রেগ এর উত্তর
Function.caller
তবে কঠোর মোডে কাজ করবে না।
আমি জানি আপনি "জাভাস্ক্রিপ্টে" উল্লেখ করেছেন, তবে উদ্দেশ্যটি যদি ডিবাগ করা হয় তবে আমি মনে করি কেবল আপনার ব্রাউজারের বিকাশকারী সরঞ্জামগুলি ব্যবহার করা আরও সহজ। এটি ক্রোমে কেমন দেখাচ্ছে: আপনি যেখানে স্ট্যাকটি তদন্ত করতে চান ঠিক সেখানে ডিবাগারটি ফেলে দিন।
পুনরুদ্ধার করতে (এবং এটি আরও পরিষ্কার করা) ...
এই কোড:
function Hello() {
alert("caller is " + arguments.callee.caller.toString());
}
এর সমতুল্য:
function Hello() {
alert("caller is " + Hello.caller.toString());
}
স্পষ্টতই প্রথম বিটটি আরও বহনযোগ্য, যেহেতু আপনি ফাংশনটির নাম পরিবর্তন করতে পারেন, "হ্যালো" থেকে "সিওও" তে বলুন, এবং এখনও পুরো জিনিসটি কাজ করতে পারেন।
পরবর্তী ক্ষেত্রে, আপনি যদি অনুরোধ ফাংশনটির নাম (হ্যালো) এর রিফ্যাক্টর স্থির করার সিদ্ধান্ত নেন তবে আপনাকে তার সমস্ত উপস্থিতি পরিবর্তন করতে হবে :(
আপনি পুরো স্ট্যাকট্রেস পেতে পারেন:
arguments.callee.caller
arguments.callee.caller.caller
arguments.callee.caller.caller.caller
কলার না হওয়া পর্যন্ত null
।
দ্রষ্টব্য: এটি পুনরাবৃত্ত ফাংশনগুলিতে একটি অসীম লুপ তৈরি করে cause
আমি সাধারণত (new Error()).stack
ক্রোমে ব্যবহার করি । সুন্দর জিনিস হ'ল এটি আপনাকে লাইন নম্বর দেয় যেখানে কলার ফাংশন বলে। খারাপ দিকটি এটি স্ট্যাকের দৈর্ঘ্য 10-এ সীমাবদ্ধ করে, এই কারণেই আমি এই পৃষ্ঠায় প্রথম স্থানে এসেছি।
(মৃত্যুদন্ড কার্যকর করার সময় নিম্ন স্তরের কনস্ট্রাক্টরে কলস্ট্যাকগুলি সংগ্রহ করতে, এটি দেখতে এবং পরে ডিবাগ করার জন্য আমি এটি ব্যবহার করছি, তাই ব্রেকপয়েন্ট স্থাপন করা কার্যকর নয় কারণ এটি হাজার হাজার বার আঘাত হানা যাবে)
'use strict';
জায়গাটিতে থাকাকালীন আমি এই কাজটি করতে পারি । আমার প্রয়োজনীয় তথ্য আমাকে দিয়েছেন - ধন্যবাদ!
আপনি যদি এটি << 11 এ চালাচ্ছেন না তবে কনসোল.ট্রেস () উপযুক্ত হবে।
function main() {
Hello();
}
function Hello() {
console.trace()
}
main()
// Hello @ VM261:9
// main @ VM261:4
কলিং ফাংশনটি পেতে আপনি 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/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ফাংশন / ক্যালার
Cannot access caller property of a strict mode function
আমি এটি করব:
function Hello() {
console.trace();
}
function Hello() {
alert(Hello.caller);
}
arguments.callee.caller.toString()
এটা ব্যবহার করা নিরাপদ *arguments.callee.caller
যেহেতু arguments.caller
হয় অবচিত ...
arguments.callee
ES5 এ অবমূল্যায়ন করা হয় এবং কঠোর মোডে সরানো হয়।
arguments.callee
এমন সমস্যার একটি খারাপ সমাধান ছিল যা এখন উন্নততর সমাধান করা হয়েছে বিকাশকারী.মোজিলা.আর.ইন-
দেখে মনে হচ্ছে এটি বেশ সমাধান করা প্রশ্ন তবে আমি সম্প্রতি জানতে পেরেছি যে ক্যালিকে 'কড়া মোডে' অনুমতি দেওয়া হচ্ছে না তাই আমার নিজের ব্যবহারের জন্য আমি একটি ক্লাস লিখেছিলাম যেখান থেকে এটি ডাকা হবে সেখানেই পথ পাবে। এটি একটি ছোট সহায়ক সহায়তার অংশ এবং আপনি যদি কোডটি স্ট্যান্ডেলোন ব্যবহার করতে চান তবে কলারের স্ট্যাক ট্রেস ফেরত দিতে ব্যবহৃত অফসেটটি পরিবর্তন করতে হবে (২ এর পরিবর্তে 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()
কনসোল দিয়ে আমার জন্য কাজ করে না (কোনও ফাইলে চেষ্টা করে দেখেনি), তবে মনে হয় যুক্তিসঙ্গত ধারণা আছে। দৃশ্যমানতার জন্য যাইহোক আপবোট করা উচিত।
এটি অ্যাক্সেস করার চেষ্টা করুন:
arguments.callee.caller.name
আপনার ত্রুটি স্ট্যাক লগ কনসোল। তারপরে আপনি জানতে পারবেন কীভাবে আপনাকে ডাকা হচ্ছে
const hello = () => {
console.log(new Error('I was called').stack)
}
const sello = () => {
hello()
}
sello()
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();
}());
ES6 এবং কঠোর মোড উভয় ক্ষেত্রে, কলার ফাংশনটি পেতে নিম্নলিখিত ব্যবহার করুন
console.log((new Error()).stack.split("\n")[2].trim().split(" ")[1])
দয়া করে নোট করুন, উপরের লাইনটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, যদি কোনও কলার বা কোনও পূর্ববর্তী স্ট্যাক না থাকে। সেই অনুযায়ী ব্যবহার করুন।
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
আমি এর জন্য এখানে আমার ফিডল যুক্ত করতে চেয়েছিলাম:
http://jsfiddle.net/bladnman/EhUm3/
আমি এটি ক্রোম, সাফারি এবং আইই (10 এবং 8) পরীক্ষা করেছি। ঠিকভাবে কাজ করে. এখানে কেবল 1 টি ফাংশন রয়েছে যা গুরুত্বপূর্ণ, তাই আপনি যদি বড় মাপসই দ্বারা ভয় পান তবে নীচে পড়ুন।
দ্রষ্টব্য: এই ঝাঁকুনিতে আমার নিজস্ব "বয়লারপ্লেট" মোটামুটি পরিমাণ রয়েছে। আপনি সেগুলি সরাতে পারেন এবং পছন্দ করতে চাইলে স্প্লিট ব্যবহার করতে পারেন। আমি নির্ভর করতে এসেছি এটি কেবলমাত্র একটি অতি-সুরক্ষিত "ফাংশনগুলির সেট।
সেখানে একটি "জেএসফিডাল" টেমপ্লেট রয়েছে যা আমি অনেকগুলি ফিডলকে কেবল দ্রুত ফিডলিংয়ের জন্য ব্যবহার করি।
String.prototype.trim = trim;
আপনি যদি কোডটি না দিয়ে কেবল ফাংশনটির নাম চান এবং ব্রাউজার-স্বাধীন সমাধান চান তবে নিম্নলিখিতটি ব্যবহার করুন:
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]);
কেবল আপনাকে জানাতে চাই যে ফোনগ্যাপ / অ্যান্ড্রয়েডে এটি name
কাজ করছে বলে মনে হচ্ছে না। তবে arguments.callee.caller.toString()
কৌতুক করবে।
এখানে, রেজিএক্সপ্যাকের সাথে বাদে সমস্ত 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>
সম্পূর্ণ স্ট্যাকট্র্যাস পেতে এখানে একটি ফাংশন :
function stacktrace() {
var f = stacktrace;
var stack = 'Stack trace:';
while (f) {
stack += '\n' + f.name;
f = f.caller;
}
return stack;
}
হেস্টওয়ার্টের উত্তর এবং জিয়ারংউউ এর উত্তর উভয়ই উল্লেখ করেছে যে 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
পদ্ধতির কাজ করে না। এটি আপনাকে প্রসঙ্গটি, উত্স ফাইল এবং লাইন নম্বরও প্রদর্শন করবে। তবে সমাধান ক্রস প্ল্যাটফর্মটি করার জন্য প্রচেষ্টা প্রয়োজন।
দ্রষ্টব্য আপনি নোড.জেজে 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
}
*/
}
নিম্নলিখিত কোড ব্যবহার করে দেখুন:
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 এ আমার জন্য কাজ করেছেন।
arguments.callee
বহু বছর ধরে হতাশ হয়েছে ।
এই সমস্যার চারপাশে অন্য উপায় হ'ল পরামিতি হিসাবে কলিং ফাংশনের নামটি কেবল পাস করা।
উদাহরণ স্বরূপ:
function reformatString(string, callerName) {
if (callerName === "uid") {
string = string.toUpperCase();
}
return string;
}
এখন, আপনি এইভাবে ফাংশনটি কল করতে পারেন:
function uid(){
var myString = "apples";
reformatString(myString, function.name);
}
আমার উদাহরণটি ফাংশনটির নামটির একটি হার্ড কোডিং চেক ব্যবহার করে তবে আপনি সেখানে যা চান তা করতে আপনি খুব সহজেই একটি স্যুইচ স্টেটমেন্ট বা অন্য কোনও যুক্তি ব্যবহার করতে পারেন।
যতদূর আমি জানি, আমাদের কাছে এর মতো প্রদত্ত উত্স থেকে 2 টি উপায় রয়েছে-
function whoCalled()
{
if (arguments.caller == null)
console.log('I was called from the global scope.');
else
console.log(arguments.caller + ' called me!');
}
function myFunc()
{
if (myFunc.caller == null) {
return 'The function was called from the top!';
}
else
{
return 'This function\'s caller was ' + myFunc.caller;
}
}
আপনার উত্তর আছে মনে করুন :)।
উপরের সমস্ত সমাধান কেন রকেট বিজ্ঞানের মতো দেখাচ্ছে। এদিকে, এই স্নিপেটের চেয়ে বেশি জটিল হওয়া উচিত নয়। এই লোকটির সমস্ত ক্রেডিট
আপনি জাভাস্ক্রিপ্টে কলার ফাংশনটি কীভাবে খুঁজে পাবেন?
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)]
আমি এই প্রশ্নটি দিয়ে প্রশ্ন এবং বর্তমান অনুগ্রহ উভয়কেই সম্বোধন করার চেষ্টা করছি।
অনুগ্রহকারীটির প্রয়োজন হয় যে কলারটি কঠোর মোডে নেওয়া উচিত এবং আমি এটি সম্পন্ন দেখতে পাবার একমাত্র উপায় হ'ল কঠোর মোডের বাইরে ঘোষিত কোনও ফাংশন উল্লেখ করে।
উদাহরণস্বরূপ, নিম্নলিখিতটি মানহীন তবে এর পূর্ববর্তী (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();
আপনার যদি সত্যিই কোনও কারণে কার্যকারিতা প্রয়োজন হয় এবং এটি ক্রস ব্রাউজারের সাথে সামঞ্জস্যপূর্ণ হতে চান এবং কঠোর স্টাফের জন্য চিন্তা না করে এবং সামনের দিকে সামঞ্জস্যপূর্ণ হন তবে এই রেফারেন্সটি পাস করুন:
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
}
আমি মনে করি যে নিম্নলিখিত কোড অংশটি সহায়ক হতে পারে:
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