Lor*_*uer 1 javascript variables scope get
我有几个变量分配给同一个函数。属性“name”是“”,因为这个函数是匿名的;
也没有涉及函数调用,因此没有被调用者。
JS 中有没有办法通过自实现的反射算法来获取变量的名称?
例如
var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;
Run Code Online (Sandbox Code Playgroud)
背景:
为了空间效率,数以千计的变量名被分配给与延迟加载的树桩相同的“静态”函数,在第一次调用时会解析为单个函数。(变量名还包含一个命名空间)。
替代品:
我的替代方法是使用诸如 {_name: myUnknownNamedVar1 , _fn: x}
这个问题的解决方案会很有趣。一个特殊的问题是在脚本中辨别具有不同名称的变量,它们指向同一个对象。
可以使用对象反射,例如:
const getVarName = obj => Object.keys(obj)[0];
const varToGetTheNameOf = "Value!";
getVarName({ varToGetTheNameOf }) // => "varToGetTheNameOf"
Run Code Online (Sandbox Code Playgroud)
var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;
var txt = (document.currentScript && document.currentScript.textContent) ||
(document.scripts && document.scripts[1]
&& document.scripts[1].textContent);
var arr = txt.match(/var\s*(.*)\s*=\s*x\b/);
arr[1] = arr[1].replace(/\s+$/,"");
var vars = arr[1].split(/\s*=\s*/);
// vars: ["myUnknownNamedVar1", "myUnknownNamedVar2"]
Run Code Online (Sandbox Code Playgroud)
var x = function(){}
var myUnknownNamedVar1 = myUnknownNamedVar2 = x;
var vars = [];
for (var prop in window){
if (window[prop] == x)
vars.push(prop);
}
// vars: ["x", "myUnknownNamedVar1", "myUnknownNamedVar2"]
Run Code Online (Sandbox Code Playgroud)
注意:两种方法都需要改进(例如递归、更好/更多的匹配模式)。第二个仅查看全局变量,而闭包中的某些变量可能不会暴露给全局命名空间。此外,还有对象的对象。
| 归档时间: |
|
| 查看次数: |
3745 次 |
| 最近记录: |