为了账号安全,请及时绑定邮箱和手机立即绑定

获取范围内的所有变量

获取范围内的所有变量

狐的传说 2019-07-05 14:31:52
获取范围内的所有变量是否有方法获取javascript中当前范围内的所有变量?
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

没有。“in作用域”变量由“作用域链”决定,该链无法以编程方式访问。

要了解详细信息(相当多),请查看ECMAScript(JavaScript)规范。这里有一个链接下载规范(PDF)的官方页面,以及这里有一个到官方的,可链接的HTML版本。

根据您对Camsoft的评论进行更新

变量范围内因为事件函数是由定义事件函数的位置决定的,而不是由它们如何调用它决定的。,您可以通过this并通过按照KennyTM所指出的思路做一些事情来论证(for (var propName in ____)),因为这将告诉您在提供给您的各种对象上有什么可用的(this和论点;如果你不确定他们给了你什么论据,你可以通过arguments为每个函数隐式定义的变量)。

因此,除了定义函数的位置之外,您还可以通过以下其他方法找到其他可用的方法:

var n, arg, name;alert("typeof this = " + typeof this);for (name in this) {
    alert("this[" + name + "]=" + this[name]);}for (n = 0; n < arguments.length; ++n) {
    arg = arguments[n];
    alert("typeof arguments[" + n + "] = " + typeof arg);
    for (name in arg) {
        alert("arguments[" + n + "][" + name + "]=" + arg[name]);
    }}

(您可以对此进行扩展,以获得更多有用的信息。)

相反,我可能会使用像Chrome的dev工具这样的调试器(即使您通常不使用Chrome进行开发)或火虫(即使你通常不使用Firefox进行开发),或者Opera上的蜻蜓,或者IE上的“F12开发者工具”。并阅读他们提供给您的任何JavaScript文件。把他们打倒在头上找合适的医生。*-)


查看完整回答
反对 回复 2019-07-05
?
慕神8447489

TA贡献1780条经验 获得超1个赞

虽然每个人都会回答“我知道“不”是正确的答案,但如果你真的需要局部变量对于一个函数,有一种受限的方式。

考虑这一职能:

var f = function() {
    var x = 0;
    console.log(x);};

可以将函数转换为字符串:

var s = f + '';

您将获得作为字符串的函数源。

'function () {\nvar x = 0;\nconsole.log(x);\n}'

现在,您可以使用如下所示的解析器埃斯普里马解析函数代码并查找局部变量声明。

var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';s = s.slice(12); 
// to remove "function () "var esprima = require('esprima');var result = esprima.parse(s);

并查找具有以下内容的对象:

obj.type == "VariableDeclaration"

结果(我删除了console.log(x)(见下文):

{
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "x"
                    },
                    "init": {
                        "type": "Literal",
                        "value": 0,
                        "raw": "0"
                    }
                }
            ],
            "kind": "var"
        }
    ]}

我已经在Chrome,Firefox和Node上测试过这一点。

问题使用此方法,您只需在函数本身中定义变量。例如,对于这个例子:

var g = function() {
    var y = 0;
    var f = function() {
        var x = 0;
        console.log(x);
    };}

您只需访问x而不是y..但你还是可以用打电话者(arguments.callee.caller.caller)在循环中查找调用函数的局部变量。如果您有所有局部变量名,那么作用域变量..使用变量名,您可以使用简单的val访问值。


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 512 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号