使用 javascript 确定 javascript 中的堆栈深度

     2023-02-21     14

关键词:

【中文标题】使用 javascript 确定 javascript 中的堆栈深度【英文标题】:determine stack depth in javascript using javascript 【发布时间】:2012-01-13 14:23:12 【问题描述】:

有没有办法通过使用 javascript 本身来确定在 javascript 中执行的所有函数的堆栈深度?

我认为这可能涉及修改Function 原型,但我真的不知道。

此外,能够在堆栈深度足够高的任何时候中断会很好。

原因是我有一个stack overflow error in IE which is apparently not debuggable。我很懒惰,我宁愿不必通过我维护的代码来寻找原因。

感谢您帮助我的懒惰。

【问题讨论】:

您可以将一个函数告诉另一个函数并递增一个全局变量,直到浏览器本身引发堆栈溢出错误。然后你打印你的计数器变量,你有一个粗略的堆栈深度值。 【参考方案1】:

ECMAscript 支持 Function.prototype.caller 属性已经有一段时间了。即使它在 ES5 strict 中被弃用,IE 仍然应该支持它。因此,您基本上可以通过所涉及的功能循环往上。

function one() 
   two();


function two() 
   three();


function three() 
    var caller = three.caller;

    console.log('caller was: ', caller.name);

    while( caller = caller.caller ) 
           console.log('caller was: ', caller.name);
    


(function outer() 
    one();
());

这将输出:

caller was: two
caller was: one
caller was: _outer

因此,如果您知道错误发生在哪个函数中,那么您就可以从最初调用该方法的方式中得到答案。如果您只是在深度之后,您可以计算在caller.caller 属性上进行了多少次交互。至少 IE8 应该支持“debugger”语句,您可以在该脚本中调用它来将调试器带到舞台上。

【讨论】:

这看起来很像我想要的......但问题是我需要以某种方式将其应用于所有函数,而不必将其添加到他们的代码中。你懂我的意思吗?谢谢。 @user420667:我认为在 Function.prototype 上没有任何“简单”的方法可以做到这一点。您基本上需要对所有对象进行递归循环(以window 开头)并检查函数。如果找到,则需要挂钩/修补该方法并调用上面提供的代码。可能会奏效。 哦,好吧..所以每个函数都有类似的东西...... newFunction = function() oldFunction(args); if(CallerDepth() > MaxAllowedDepth) 调试器; ;旧功能 = 新功能; ???我不认为这是完全正确的。另外,就像您说的那样,确保以某种方式在任何其他函数之前被调用,并确保在修改任何函数之前创建要迭代的函数列表。 “即使它在 ES5 strict 中已被弃用”。没有足够的警告,这应该被使用。 @jAndy 调试目的很好。但是,您应该在生产环境中运行 es5 strict【参考方案2】:
function stackDepth() 
  var c=stackDepth.caller, depth=0;
  while (c)  c = c.caller; depth++; 
  return depth;

Chrome 似乎认为控制台的堆栈深度已经是 3,因此可能对于每个 JavaScript 环境,您都需要确定初始基线深度并从中减去。

stackDepth(); // => 3
(function()return stackDepth();)(); // => 4

【讨论】:

有趣。我想知道 3 个更高级别的对象是什么。窗户?文件?

使用 javascript 确定 javascript 中的堆栈深度

】使用javascript确定javascript中的堆栈深度【英文标题】:determinestackdepthinjavascriptusingjavascript【发布时间】:2012-01-1314:23:12【问题描述】:有没有办法通过使用javascript本身来确定在javascript中执行的所有函数的堆栈深度?我认为这... 查看详情

使用 javascript 在元素中创建元素

】使用javascript在元素中创建元素【英文标题】:Creatingelementswithinelementswithjavascript【发布时间】:2015-11-1917:28:24【问题描述】:这里是菜鸟。我在互联网上搜索了一下以找到问题的答案,但我似乎找不到任何答案(这让我的希望... 查看详情

是否可以使用 Javascript 在链接上“悬停”?

】是否可以使用Javascript在链接上“悬停”?【英文标题】:IsitpossibletouseJavascriptto"hover"overlinks?【发布时间】:2012-08-2114:24:49【问题描述】:假设我有一个网页,它使用第三方JavaScript库从他们的API中提取JSONP数据,然后根... 查看详情

jquery

jQuery 1.JavaScript库作用及对比为了简化JavaScript的开发,一些JavaScript库诞生了。JavaScript库封装了很多预定义的对象和使用函数。能帮助使用者建立高难度交互的Web2.0特性的富客户端页面,并且兼容各大浏览器。目前流行的JavaSc... 查看详情

使用 javascript/jquery 动态创建 div

】使用javascript/jquery动态创建div【英文标题】:dynamicallycreatingdivusingjavascript/jquery【发布时间】:2013-09-2908:05:57【问题描述】:我在html中有两个名为“answerdiv1”和“answerdiv2”的div。现在我想给/创建唯一的divid,比如“answerdiv3”... 查看详情

如何使用 Javascript/jQuery 确定图像是不是已加载?

】如何使用Javascript/jQuery确定图像是不是已加载?【英文标题】:HowcanIdetermineifanimagehasloaded,usingJavascript/jQuery?如何使用Javascript/jQuery确定图像是否已加载?【发布时间】:2010-09-2018:32:19【问题描述】:我正在编写一些Javascript来调... 查看详情

如何使用 Javascript/jQuery 确定图像是不是已加载?

】如何使用Javascript/jQuery确定图像是不是已加载?【英文标题】:HowcanIdetermineifanimagehasloaded,usingJavascript/jQuery?如何使用Javascript/jQuery确定图像是否已加载?【发布时间】:2010-09-2018:32:19【问题描述】:我正在编写一些Javascript来调... 查看详情

如何在 javascript 列表中使用 CSS 选择器?

】如何在javascript列表中使用CSS选择器?【英文标题】:HowtouseaCSSselectoronajavascriptlist?【发布时间】:2016-08-0819:04:51【问题描述】:为什么这不起作用?varanimals=[\'Cat\',\'Dog\'].valueOf;if("animals:contains(Cat)")//...【问题讨论】:javascript... 查看详情

是否可以确定何时使用 JavaScript 渲染了元素?

】是否可以确定何时使用JavaScript渲染了元素?【英文标题】:IsispossibletodeterminewhenanelementhasbeenrenderedusingJavaScript?【发布时间】:2011-04-0917:46:02【问题描述】:是否有jQuery等效于执行以下操作:$(document).ready(function()对于一个元素... 查看详情

确定使用javascript检查哪个单选按钮[重复]

】确定使用javascript检查哪个单选按钮[重复]【英文标题】:Determinewhichradiobuttonischeckedwithjavascript[duplicate]【发布时间】:2014-09-1611:20:35【问题描述】:大家好,有人可以帮我解决以下问题。//我把问题写在javascript里面了例如,请... 查看详情

从托管 bean 调用 JavaScript 函数

】从托管bean调用JavaScript函数【英文标题】:CallingaJavaScriptfunctionfrommanagedbean【发布时间】:2011-08-0605:03:15【问题描述】:有没有办法从JSF中的托管bean调用(执行)JavaScript函数?如果这是相关的,我也在使用PrimeFaces。【问题讨... 查看详情

javascript使用javascriptfeaturetestin确定css属性支持(代码片段)

查看详情

使用 JavaScript 和 Razor 检测移动设备

】使用JavaScript和Razor检测移动设备【英文标题】:DetectMobileDevicewithJavaScriptandRazor【发布时间】:2013-04-1022:31:32【问题描述】:我一直在寻找一种简单且轻量级的解决方案来检测移动设备并呈现适当的视图。很遗憾,我的方法并... 查看详情

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

】所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?【英文标题】:Arealljavascriptcallbacksasynchronous?Ifnot,howdoIknowwhichare?【发布时间】:2013-10-0516:12:09【问题描述】:我很好奇是否所有javascript回调都是异步的,或者... 查看详情

Javascript - 使用表单字段值来确定要使用的电子邮件地址

】Javascript-使用表单字段值来确定要使用的电子邮件地址【英文标题】:Javascript-usingformfieldvaluestodeterminewhichemailaddresstouse【发布时间】:2020-12-1616:32:18【问题描述】:这里是Javascript新手,如果这是非常基础的代码而不是最漂亮... 查看详情

array.shift和链接列表在javascript中的等价物之间的性能差异是什么

在JavaScript中实现队列时有很多选项。一种可能的实现是使用Array,使用Array.push向队列添加元素,并使用Array.shift将其从队列中删除。另一种可能的实现是使用链接列表并添加到尾部并从头部移除。通过对Stacks实现的测试,我已经... 查看详情

是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

】是否可以使用JavaScript确定GeoJSON点是否在GeoJSON多边形内?【英文标题】:IsitpossibletodetermineifaGeoJSONpointisinsideaGeoJSONpolygonusingJavasScript?【发布时间】:2016-02-2111:53:33【问题描述】:是否可以仅使用JavaScript(通过d3、topojson或任何... 查看详情

JavaScript 速记三元运算符

】JavaScript速记三元运算符【英文标题】:JavaScriptshorthandternaryoperator【发布时间】:2012-02-1115:12:50【问题描述】:我知道在PHP5.3中不要使用这种多余的三元运算符语法:startingNum=startingNum?startingNum:1...我们可以在适用的情况下为三... 查看详情