虽然每个人都会回答“不我知道“不”是正确的答案,但如果你真的需要局部变量对于一个函数,有一种受限的方式。
考虑这一职能: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访问值。