虽然每个人的回答都是“ 否 ”,而且我也知道“否”才是正确答案,但是如果你真的需要获取 局部变量 ,那么就有一种受限制的方法。
考虑这个函数:
var f = function() {
var x = 0;
console.log(x);
};
您可以将函数转换为字符串:
var s = f + '';
您将获得字符串形式的函数源
'function () {\nvar x = 0;\nconsole.log(x);\n}'
这样的解析器 esprima 来解析函数代码并查找局部变量声明。
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 在循环中 调用者 链 范围变量 。使用变量名,您可以通过简单的 eval 访问值。