获取范围内的所有变量
有没有办法让所有目前在JavaScript范围内的变量?
没有。“范围内”的变量是由“范围链”决定的,这是不能通过编程方式访问的。
有关详细信息(相当多),请查看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的开发工具(即使通常不使用Chrome进行开发)或Firebug (即使通常不使用Firefox进行开发)的调试器,也可能使用Opera上的Dragonfly ,或者IE上的“F12开发工具”。 并阅读他们提供给您的任何JavaScript文件。 并击败他们的头上适当的文档。 🙂
虽然每个人回答“ 不 ”,我知道“不”是正确的答案,但如果你真的需要得到一个函数的局部变量有一个限制的方式。
考虑这个功能:
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 。 但仍然可以在循环中使用调用者链(arguments.callee.caller.caller.caller)来查找调用者函数的局部变量。 如果你有所有的局部变量名,所以你有范围变量 。 通过变量名称,您可以使用简单的eval来访问值。
是和不是。 几乎在所有情况下都是“不”。 “是的”,但只有有限的方式,如果你想检查全球范围。 以下面的例子:
var a = 1, b = 2, c = 3; for ( var i in window ) { console.log(i, typeof window[i], window[i]); }
其中包括以下其中150项以上的产出:
getInterface function getInterface() i string i // <- there it is! c number 3 b number 2 a number 1 // <- and another _firebug object Object firebug=1.4.5 element=div#_firebugConsole "Firebug command line does not support '$0'" "Firebug command line does not support '$1'" _FirebugCommandLine object Object hasDuplicate boolean false
所以可以列出当前范围内的一些变量,但不可靠,简洁,高效或容易访问。
更好的问题是为什么你想知道范围内的变量?
你不能。
变量,函数声明的标识符和函数代码的参数被绑定为变量对象的属性,这是不可访问的。
也可以看看:
- 范围链和标识符解析
大家都注意到:你不能。 但是你可以创建一个obj,并把你声明的每个var分配给那个obj。 这样,你可以很容易地检查你的变数:
var v = {}; //put everything here var f = function(a, b){//do something }; vf = f; //make's easy to debug var a = [1,2,3]; va = a; var x = 'x'; vx = x; //so on... console.log(v); //it's all there
在特定范围内获取变量的最简单方法
- 打开开发者工具>资源(在Chrome中)
- 用可以访问该范围的函数打开文件(提示cmd / ctrl + p查找文件)
- 在该函数内设置断点并运行你的代码
- 当它停在你的断点时,你可以通过控制台(或范围变量窗口)访问范围var,
注意:您想要对未缩小的js执行此操作。
显示所有非私人变数的最简单的方法
- 打开控制台(在Chrome中)
- 键入: this.window
- 按Enter键
现在您将看到一个对象树,您可以使用所有已声明的对象进行扩展。
在ECMAScript 6中,通过使用代理对象将代码封装在with
语句中,或多或少是可能的。 注意它需要非严格的模式,这是不好的做法。
function storeVars(target) { return new Proxy(target, { has(target, prop) { return true; }, get(target, prop) { return (prop in target ? target : window)[prop]; } }); } var vars = {}; // Outer variable, not stored. with(storeVars(vars)) { var a = 1; // Stored in vars var b = 2; // Stored in vars (function() { var c = 3; // Inner variable, not stored. })(); } console.log(vars);
如果您只是想手动检查变量来帮助调试,只需启动调试器:
debugger;
直接进入浏览器控制台。
-
从一开始就得到任何人以任何方式或任何方式编写或输入的每个单词的列表(绝对是数学意义上的有限列表)。
-
把它们全部放在一个大的数组中,把它们全部再次输入到你的开发控制台(作为字符串,所以你不会在这里抛出错误)。
-
创建新的数组,并在有限的列表上做一个循环,如果一个try / catch(在try中做这个事情)不会在catch中结束,则由于ReferenceError(使用eval为“unstring”如果不在范围内,你确实需要这个错误)。
-
我拿回来。 我在第一点讨论的名单不够大。 他们可以通过窗口[randomlyGeneratedString] =东西创建变量。 更好地循环使用任何计算机程序可以在合理的可行时间范围内停止的所有字符串 – 也就是从计算机发明以来的时间。
好的,你可以这样做,使用1)在整个代码库上运行esprima.parse得到的东西,然后遍历树名称为“Identifier”并存储它们的“名称”。 但是,那么你会错过在window [“file_”+ i] = blah中创建的变量,参见4。