javascript - JS怎么获取变量名称(反射)
高洛峰
高洛峰 2017-04-10 15:32:14
0
9
3592

JS中怎么在程序执行的时候,获取变量名称。

比如通过一个函数返回指定参数的参数名。

jsvar paramName = 'asdf' // 不管等于什么。
var paramName2 = new Object(); // 不管等于什么。

function getParamName(p) {
    // ...实现过程
    var result = ...; // 这里只是模拟
    return result;
}

getParamName(paramName);
getParamName(paramName2);

最终参数的返回结果应该为:

output  Output:
  paramName
  paramName2

请问,类似的需求怎么实现,有没有变通的方法?

看了一下,感觉 http://segmentfault.com/q/1010000002761696#a-1020000002765874 说的比较合理。

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(9)
巴扎黑

2017.1.5 答案已重写

每一个上下文都有一个与之对应的变量对象,任何声明的变量都是这个变量对象的属性。全局上下文的变量对象是全局对象,因而在全局声明的变量就变成了全局对象的属性。相应地,函数上下文的变量对象是活化对象,在函数上下文声明的变量是活化对象的属性。然而,活化对象是引擎内部的一个对象,不可被外部访问,因而不可在 JS 中获取函数上下文变量的名称。

此外基本类型的函数实参是以传值的方式传入函数的,对象类型的实参是以引用的方式传入函数的,无论哪种方式,函数都只能得到传入的值或者引用,而无法访问调用函数的上下文的变量对象,因而不能在函数内部获得传入函数的变量的名称。

既然没有函数能够返回调用这个函数的上下文中变量的名称,JS 也没有提供能做到这件事的操作符,那么在执行上下文内部获取该执行上下文内部变量的名称也就是不可能的。

当然啦,对于函数代码的执行上下文,如果我们能获得这个函数的代码,就可以解析这段代码得到这段代码当中变量的名称。

示例代码:

function getParamName() {}

function fn() {
  var param1 = 0
  var a = 2

  console.log(getParamName(param1))
  console.log(getParamName(a))
}

function callWithVariableName(fn) {
  eval('(' + fn.toString().replace(/\bgetParamName\s*\(([a-zA-Z_$][\w_$]*)\)/g, function(u, v) {
    return "'" + v + "'"
  }) + '())')
}

callWithVariableName(fn)

控制台输出:

param1
a
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!