在 Javascript 函数中获取变量 outside-name?[复制]

Getting variable outside-name inside Javascript function? [duplicate]

提问人:M A 提问时间:10/5/2023 最后编辑:M A 更新时间:10/5/2023 访问量:65

问:

这个问题在这里已经有答案了:
上个月关闭。

社群在上个月审查了是否要重新讨论这个问题,并关闭了这个问题:

原始关闭原因未解决

我正在尝试处理一些列出数据内部对象(无论有多深)并带有间距的东西。

像这样:

const data = [1,2,3];
test(data);
Output:
"[
  1,
  2,
  3
]"

到目前为止,我已经解决了获取对象变量名称等的所有噱头,因此得到了类似的东西:

const data = {a: 1, b: 2};
test(data);

Outputs:
"{
  a: 1,
  b: 2
}"

因此,我能够递归地循环几乎所有内容,并且我还添加了第二个参数以能够搜索给定的键或变量。

所以这已经是有效的代码,但我缺少的是我想用给定给函数的对象名称开始打印,类似于:

const data = "hello";
test(data);

Outputs:
"data: "hello""

const data = {a: 1, b: 2};
test(data);

Outputs:
"data: {
  a: 1,
  b: 2
}"

我尝试了 Object.keys,但我无法访问函数外部的对象名称。

我已经看到您可以通过在 start 中将给定变量分配为对象来做到这一点,例如: 测试({数据});

因此,通过这种方式,这将生成一个传递的对象,其中有一个数据键和数据值。

但我只是想知道这是否可以在没有的情况下完成?

我只是想让我的编码伙伴们尽可能简单,并且更喜欢按原样传递的变量,而不添加任何额外的内容。

为了避免任何混淆,我想要的只是函数开始编写带有变量名称的输出(在本例中;data),以 “[variable name]: ” 开头,或如示例 “data: ”,在调用函数时不要尝试添加大括号。

像这样:

function getObjectData(o) {
  oName = ...
  console.log(oName + ": " + o)
}

这要简单地称为(同样,没有大括号):

const data = "hello";
getObjectData(data);

并产生输出:

"data: hello"
JavaScript 函数 变量

评论

2赞 Community 10/5/2023
请澄清您的具体问题或提供其他详细信息以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。
2赞 semkeijsper 10/5/2023
如果变量的名称与数据相关,我建议将其与数据一起存储
1赞 Eric MORAND 10/5/2023
现在这是一个有趣的问题——我不明白为什么它被否决了。我试图在模块中声明一个常量,它们从对象中检索属性列表,然后......我的常数不存在。这很有趣,因为它提出了一个问题:如果不在全局对象中,常量/变量存储在哪里 - 要么或?globalglobalwindow
2赞 Nick Parsons 10/5/2023
@EricMORAND两者都不是:P在顶层声明的 s、s 和 s(所谓的“词法声明”变量)位于它们自己的空间(即:环境记录)中,称为“声明性环境”。JavaScript 没有提供一种方法来“查看”它,就像我们通过使用全局对象(例如:)存储在“对象环境”中的 / 变量一样(更多信息在这里这里是它们设置的地方)constletclassvarfunctionwindow
1赞 Eric MORAND 10/5/2023
非常感谢@NickParsons。我一直假装非常了解 ECMAScript 规范 - 我实际上一直在教他们 - 我完全错过了这一点。非常感谢。

答:

2赞 Florent M. 10/5/2023 #1

在原生 JavaScript 中,变量本身不能直接传递到函数中。相反,传递的是存储在变量中的值。

但是,您可以使用解决方法,方法是传递一个将变量保存为属性的对象。这样,您可以访问函数中的键(变量名称)和值。

下面是一个示例:

test({data})

function test(obj) {
  const key = Object.keys(obj)[0];
  const value = obj[key];
  console.log(`${key}: ${JSON.stringify(value)}`);
}

评论

0赞 M A 10/5/2023
谢谢,但我正在寻找可以不用大括号的东西。我看到有一些可能性可以尝试通过循环窗口来获取变量名称,现在尝试测试一下。
0赞 Florent M. 10/5/2023
只有当变量是全局变量时,您的变量才会存储在变量中,即使它是全局变量,我也不认为遍历所有属性是一个有效的解决方案。由于属性数量过多,这可能会导致性能下降,如果多个变量具有相同的值,则此方法将不起作用windowwindow
2赞 Florent M. 10/5/2023
这是不可能的,函数不能知道变量的原始名称,只能知道参数的名称。所以是的,你被全局方法困住了,如果两个属性具有相同的值,你可以同时显示它们。我不知道你的用例,但它似乎有点混乱。
1赞 Nick Parsons 10/5/2023
除此之外,全局方法不适用于使用 或(或者如果您在模块中使用)声明的变量,即使在脚本的顶层声明也是如此,所以我认为这是最好的选择。letconstclassvar
1赞 Florent M. 10/5/2023
如果仅用于调试目的,则使用 IDE 调试器将提供变量及其值