【问题标题】:Are class declarations subject to scope in JavaScript?类声明是否受 JavaScript 范围的约束?
【发布时间】:2013-01-18 13:01:13
【问题描述】:

考虑到 JavaScript 如何使用函数来确定变量的范围,我开始思考以下示例会发生什么:

var OuterClass = function () {

    var InnerClass = function () {
        this.foo = "bar";
    };

    this.getInstanceOfInner = function () {
        return new InnerClass();
    };

};

var instanceOfOuter = new OuterClass();
console.log(instanceOfOuter.getInstanceOfInner());

Fiddle of the above

在不同的浏览器中测试上述代码,结果各不相同:

  • Chrome:记录内部类的一个实例,并且似乎知道类声明。
  • Firefox:似乎记录了一个“无类型”的对象,但具有正确的属性。
  • IE9: 记录对象[object Object] 的字符串表示形式

我对此有些困惑,这是怎么回事?类声明是否受作用域的影响,与其他变量一样吗?还是由每个供应商自行决定实施?

【问题讨论】:

  • 呃什么?我看到的唯一区别是不同的控制台如何处理控制台中的Object 实例表示。执行console.log(instanceOfOuter.getInstanceOfInner().foo),您将在所有浏览器上得到相同的字符串结果。
  • @FabrícioMatté 是的,确实如此,但在 Chrome 中,您会得到一个内部类的实例,我本以为它超出了范围。该类不应该在外部范围内为人所知。另一方面,Firefox 似乎记录了一个无类型的对象,如果类与其他变量的作用域相同,这似乎更合适。我想知道类声明是否应该在外部范围内知道。
  • @ChristoferEliasson - 即使名称 InnerClass 在外部范围内是不可见的,但一旦您从 OuterClass.getInstanceOfInner() 返回 new InnerClass(),它的定义在外部可见
  • Chrome 仅显示创建对象的函数的引用。例如,打开此页面上的控制台,然后输入$('*')。 Chrome 显示 e.fn.e.init 这是创建 jQuery 对象的新实例的函数,而 Firefox 将显示一个“无类型”对象。

标签: javascript oop class scope


【解决方案1】:

在 JavaScript 中没有类和实例,只有原型和构造函数函数(了解差异here)。它们遵循与任何其他对象相同的范围规则。所以构造函数InnerClass 本身在ÒuterClass 之外不可用,但返回的“实例”知道它的原型,浏览器可能会也可能不会记录。

【讨论】:

  • 谢谢,加上@Fabrício 在他对问题的评论中的引用,这阐明了为什么 Chrome 可以为返回的对象提供正确的名称。
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2020-06-08
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多