为什么arguments.callee.caller在JavaScript中弃用了该属性?
它已添加,然后在JavaScript中弃用,但ECMAScript完全省略了它.某些浏览器(Mozilla,IE)一直支持它,并且在地图上没有任何计划来删除支持.其他人(Safari,Opera)已经采用了它的支持,但对旧浏览器的支持是不可靠的.
是否有充分理由将这些有价值的功能置于不确定状态?
(或者,有没有更好的方法来获取调用函数的句柄?)
在Firefox中,我可以通过使用获得异常的堆栈跟踪exception.stack.
有没有办法在其他浏览器中获得它?
编辑:我实际上想要自动保存堆栈跟踪(如果可能),而不是当时调试它(即我知道如何在调试器中获取堆栈跟踪).
作为C#开发人员,我习惯了以下异常处理方式:
try
{
throw SomeException("hahahaha!");
}
catch (Exception ex)
{
Log(ex.ToString());
}
Output
------
SomeNamespace.SomeException: hahahaha!
at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27
Run Code Online (Sandbox Code Playgroud)
它非常简单,但却告诉我关于异常是什么以及它在哪里需要知道的一切.
如何在JavaScript中实现等效的东西,异常对象本身可能只是一个字符串.我真的希望能够知道发生异常的确切代码行,但是下面的代码并没有记录任何有用的东西:
try
{
var WshShell = new ActiveXObject("WScript.Shell");
return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location");
}
catch (ex)
{
Log("Caught exception: " + ex);
}
Output
------
Caught exception: [object Error]
Run Code Online (Sandbox Code Playgroud)
编辑(再次):只是为了澄清,这是内部应用程序,大量使用JavaScript.我正在寻找一种从生成系统中可能捕获的JavaScript错误中提取有用信息的方法 - 我已经有了一种日志记录机制,只是希望获得一个合理的字符串来记录.
我正在调试一些第三方缩小的Javascript,某个地方正在触发浏览器页面刷新.但是,我无法弄清楚代码的哪一部分导致刷新.
有没有办法在Chrome中设置一个断点,它会在页面刷新之前被点击,这样我就可以检查调用堆栈以查看导致它的原因了什么?
function log( msgOrObj ){
if(dev_mode){
console.log({
'message': msgOrObj,
'caller': arguments.callee.caller.toString()
});
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最多就是调用它的函数.
有没有人做过类似的事情?或者这甚至可能吗?
第70行的somescript.js中使用的示例:
log('some very important message!')
Run Code Online (Sandbox Code Playgroud) 如何从JavaScript打印堆栈跟踪?
答案如何在抛出异常时获取Javascript堆栈跟踪?处理抛出异常,但我需要打印堆栈跟踪来调试内存泄漏.
基本上我有一个相同的问题,如在Java中获取当前堆栈跟踪,但对于JavaScript.
以及如何在Node.js中打印堆栈跟踪?是类似的,但它是Node.js,我想知道JavaScript,更一般地说,如果它是不同的.
我希望能够对给定的JS应用程序执行操作,然后只需获取已调用的所有函数的大型日志.这在Chrome中是可行的,但只有在某处放置断点时才有可能.我的问题是,当我对一个给定的网站进行逆向工程时(当然,仅用于自学教学目的),通常需要花费大量时间来确定从哪里开始.这样的事情会对我有很大的帮助,因为我不再需要在代码中搜索,而是我会做一个用户操作,然后抓住堆栈日志.
我想应该有一种方法来拦截(或包装)每个函数调用,以便在调用函数之前将其转储到日志中.
是否有可能获得声明如下的匿名函数的名称?
var F = function(){};
Run Code Online (Sandbox Code Playgroud)
乍一看,答案是否定的,但显然浏览器知道并保留了函数名称:
var F = function(){};
var x = new F();
console.log(x.constructor); // function F()
Run Code Online (Sandbox Code Playgroud)
(火狐)
var F = function(){};
var x = new F();
console.log(x); // F {}
Run Code Online (Sandbox Code Playgroud)
(铬)
这个名字是否可以访问?我需要它主要用于错误记录,因此解决方案不必是跨浏览器.
编辑以澄清:
我从外部代码中获取了一个我需要知道其类型的对象,因此使用其他声明方式的明显答案不是我正在搜索的内容.
在JavaScript中,是否可以获取由另一个函数调用的所有函数的列表?我想创建一个函数依赖树,分析脚本中的函数如何相互关联(以及哪些函数需要哪些函数).
例如:
getAllCalledFunctions(funcA); //this should return [funcB, funcC, funcD], since these are the functions that are required by funcA.
function getAllCalledFunctions(functionName){
//how should I implement this?
}
function funcA(){
funcB();
funcC();
}
function funcB(){
funcD();
}
function funcC(){
funcD();
}
function funcD(){
console.log("This function is called by funcC and funcD");
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个反应库(react-xarrows.tsx),当用户向我的组件提供错误的属性时,会抛出错误(我写的),但它显示了我在“react-arrows.tsx”中编写的行。
出错时用户将看到:
/src/Xarrow.tsx:184:12
if (!("current" in props.start))
throw Error(
`'start' property is not of type reference.
maybe you set 'start' to other object and not to React reference?.\n`
);
Run Code Online (Sandbox Code Playgroud)
我想准确地向用户指出他出错的地方 - 我可以通过向 Error 提供“文件名”来做到这一点 - Error([message[, fileName[, lineNumber]]]) - 导入文件的文件名当前模块,使用我的库的用户文件 - 让我们将该文件称为“/src/Example5.tsx”。(关于“名称”我当然是指相对路径)
现在,我需要弄清楚如何获取该文件名(以及稍后的行号)。
(我确实尝试从“moudle.parents”对象中获取它作为其他类似问题的答案,但没有任何模块对象的父属性。 这是最接近帮助我的。)
必须有一种方法可以做到这一点,因为反应本身会向用户指出他出错的地方。我现在在Example5 中留下了一个错误示例(只需单击Example5)。您可以自由地使用它,如果您想出解决方案,请分享。
简化示例5:
/src/Xarrow.tsx:184:12
if (!("current" in props.start))
throw Error(
`'start' property is not of type reference.
maybe you set 'start' to other object and not to React reference?.\n`
);
Run Code Online (Sandbox Code Playgroud) javascript ×10
debugging ×2
breakpoints ×1
ecma262 ×1
exception ×1
function ×1
logging ×1
node.js ×1
reactjs ×1
stack-trace ×1