【问题标题】:Get the name of the input variable in a function获取函数中输入变量的名称
【发布时间】:2018-10-09 11:03:31
【问题描述】:

这似乎是一个很难回答的问题。给定一个函数,例如显示的函数,您将如何获取输入变量的名称以进行调试。即)root -> root.left -> root.right -> root.left.right -> etc... 或即)tree -> tree.left -> tree.right -> tree.left.right -> etc...

function TreeNode(val) {
    this.val = val;
    this.left = this.right = null;
}
var sum = function(root) {
    console.log(root);
    if(root === null) return 0;
    return root.val + sum(root.left) + sum(root.right);
}

let tree = new TreeNode(1);
tree.left = new TreeNode(2);
tree.right = new TreeNode(3);
tree.left.right = new TreeNode(4);
let x = sum(tree);
console.log(x);

基本上,我想在 sum 函数中 console.log() 变量的名称而不是 root。

【问题讨论】:

  • 所以你想登录"tree"?还是我理解有误?
  • 这是个好问题。我想要么是树,要么是根。然后,我想记录 tree.left 或 root.left 等...
  • 你不能。当您的 sum 函数被调用时,它会被传递一个值。该值是指向对象的指针,并且与指针所来自的变量完全没有联系。如果您先执行let x = y = tree;,然后执行sum(x)sum(y),则对sum() 的两次调用将完全没有区别。它们传递了完全相同的值(指向tree 对象的指针),并且根本没有对xy 的引用。
  • 如果它在运行时用于调试目的,只需使用调试器并在函数中放置断点即可。或者添加一个debugger 语句(这是一个手动调试点)。无论如何,您将能够退回到调用链以查看该函数是如何被调用的。如果您想在某种日志中看到它,那么我认为这是不可能的。

标签: javascript node.js debugging ecmascript-6 binary-tree


【解决方案1】:

您可以更改sum 函数以进行调试:

function sum(root, path) {
  if(!path) {
    path = 'root';
  }
  console.log(path);
  if(root === null) return 0;
  return root.val + sum(root.left, path+'.left') + sum(root.right, path+'.right'); 
}

【讨论】:

    【解决方案2】:

    基本上,我想在 sum 函数中 console.log() 变量的名称而不是 root。

    你不能。当您的 sum 函数被调用时,它会被传递一个值。该值是指向对象的指针,并且与指针所来自的变量完全没有联系。如果你这样做了:

    let tree = new TreeNode(1);
    let x = y = tree;
    sum(x);
    sum(y);
    

    sum() 的两次调用完全没有区别。它们每个都传递了完全相同的值(指向TreeNode 对象的指针),并且在sum() 函数中根本没有对xytree 的引用。

    如果您出于调试和/或日志记录的原因需要额外的信息(例如变量的名称),那么您可能必须将该额外的名称传递给函数以便您可以记录它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 2021-08-13
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      相关资源
      最近更新 更多