是否有可能获得变量声明范围的名称?

时间:2014-07-15 10:41:31

标签: javascript

我在JavaScript代码的某个点上有一个变量。现在我想获得声明该变量的函数(aka范围)的名称。因此,例如,如果该变量是一个对象的字段,我想得到对象类型的名称。

请考虑以下代码:

function MyClass() {
  this.name = "MyName";
  this.age = 20;
}

var myVariable = new window.MyClass();
alert(getDeclaringScope(myVariable)) // should alert 'window'
alert(getDeclaringScope(myVariable.name)) // should alert 'MyClass

有没有办法实现getDeclaringScope功能?

更新

我想使用这样的技术来访问一种“静态”变量,其中存储了用于knockoutjs observable的元信息。一个极其简化的例子:

var META = {};
META["MyClass"] = {};
META["MyClass"]["MyArray"] = { ElementType: "MyOtherClass" };

function MyClass() {
  this.MyArray = ko.observableArray();
}
function MyOtherClass() {
  this.name = "a";
}

ko.observableArray.fn.addFromPlainObjects = function(plainItems) {
  var elemType = .... here I wanted to get "MyOtherClass" from the META global variable
  // create MyOtherClass and map the plain items to it... etc.
}

2 个答案:

答案 0 :(得分:0)

您可以使用instanceof和构造函数:

例如

    myVariable instanceof MyClass; //true

    myVariable.constructor;
   // returns 
    function MyClass() {
      this.name = "MyName";
      this.age = 20;
    }

检查:instanceofconstructor

答案 1 :(得分:0)

没有

该对象具有对其构造函数的引用,但构造函数可以从许多对象引用,在这种情况下不仅仅是window。可以使用变量(而不是属性)直接访问它:

var MyClass = window.MyClass;
var foo = new MyClass();

您可以在对象模型中显式创建反向引用,因为构造函数是对象。

window.MyClass.backref = window;

虽然这很可能不是你想要的。我怀疑你对变量的范围有误解;变量范围与对象属性无关。因此,没有概念声明范围"表示从中检索变量引用的对象和对象属性,因为您似乎将其概念化。