Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类声明是否受JavaScript中作用域的约束?_Javascript_Oop_Class_Scope - Fatal编程技术网

类声明是否受JavaScript中作用域的约束?

类声明是否受JavaScript中作用域的约束?,javascript,oop,class,scope,Javascript,Oop,Class,Scope,考虑到JavaScript如何使用函数来确定变量的范围,我开始考虑在以下示例中会发生什么: var OuterClass = function () { var InnerClass = function () { this.foo = "bar"; }; this.getInstanceOfInner = function () { return new InnerClass(); }; }; var instanceOf

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

var OuterClass = function () {

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

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

};

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

在不同的浏览器中测试上述代码,结果会有所不同:

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

我有点困惑,这是怎么回事?类声明是否与其他变量一样受作用域的约束?还是由每个供应商自己来实现它?

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

Uh什么?我看到的唯一区别是不同的控制台如何处理控制台中的
对象
实例表示。做一个
console.log(instanceOfOuter.getInstanceofunner().foo)
你会在所有浏览器上得到相同的字符串结果。@fabriciomatté是的,但在Chrome中你会得到一个内部类的实例,我希望它超出范围。该类不应在外部范围内已知。另一方面,Firefox似乎记录了一个非类型化的对象,如果类与其他变量的作用域相同,那么这似乎更合适。我想知道的是类声明是否应该在外部作用域中已知。@christofreiasson-即使名称
InnerClass
对于外部作用域是不可见的,但当您从
OuterClass.getInstanceFinner()返回
new InnerClass()
时,它的定义在外部是可见的
Chrome仅显示创建对象的函数的引用。例如,打开此页面上的控制台,然后键入
$('*')
。Chrome显示了
e.fn.e.init
,这是创建jQuery对象新实例的函数,而Firefox将显示一个“非类型化”对象。请参阅相关的谢谢,以及@Fabricio在其对该问题的评论中的引用,这澄清了Chrome为什么可以为返回的对象提供正确的名称。