1

有什么区别:

function Foo(){} var foo1 = Foo();

var foo2 = new Foo()

据我测试, foo1 什么也没提供。typeof foo1 未定义,而使用 new 则可以按预期进行。

没有 new 关键字我得到未定义结果的原因是什么?

4

3 回答 3

4

这是因为隐式function Foo(){}返回undefined,即如果函数没有显式返回语句,编译器/VM 将隐式添加它。但是,当您使用new关键字时,您会从构造函数中实例化一个对象。

有关关键字作用的确切解释,请参见此答案。new

于 2013-08-27T11:54:27.923 回答
2

这是您在使用时基本上发生的事情new,它:

  1. 创建一个新对象,让它成为o.
  2. 将原型链接设置o[constructor].prototype
  3. 执行[constructor]witho作为上下文对象 ( this)。
  4. o除非返回[consructor]非原始值,否则返回。在这种情况下,将返回该非原始值而不是o. (按照@Esailija 的建议添加了这些精度)。

当您不使用new时,不会发生这种情况并且上下文对象是window,除非该函数是在另一个对象上调用的。在这种情况下,上下文对象就是那个对象。

例如

function A() {}
A(); //this points to window

var o = { A: A };

o.A(); //this points to o

Everyfunction可以是 JavaScript 中的构造函数,但是您必须使用new关键字才能获得预期的结果。

为了避免错误,有些人会设计他们的函数,以便忘记new关键字不会有害,如下所示,但是有更好的替代方法来检测这些错误,例如使用JSHint之类的代码分析工具。

例如

function Foo(args) {
    if (!(this instanceof Foo)) {
        return new Foo(args);
    }
    //initialization code
}
于 2013-08-27T12:00:43.050 回答
-2

尝试这个

function Foo(){} var foo1 = Foo();

代替

function Foo(){} var foo1 = foo();

JavaScript 是区分大小写的语言

于 2013-08-27T11:56:14.143 回答