有什么区别:
function Foo(){} var foo1 = Foo();
和
var foo2 = new Foo()
据我测试,foo1什么都没有。 typeof foo1未定义,而new是正常的。
没有new关键字我得到未定义结果的原因是什么?
答案 0 :(得分:3)
这是因为function Foo(){}
隐式返回undefined
,即如果函数没有显式的return语句,编译器/ VM将隐式添加它。但是,当您使用new
关键字时,您可以从构造函数实例化一个对象。
有关new
关键字的确切说明,请参阅this answer。
答案 1 :(得分:2)
以下是您使用new
时基本上发生的事情:
o
。o
的原型链接设置为[constructor].prototype
。[constructor]
作为上下文对象(o
)执行this
。o
,除非[consructor]
返回非原始值。在这种情况下,返回该非原始值而不是o
。 (根据@Esailija的建议添加了这些精度)。当您不使用new
时,除非在另一个对象上调用该函数,否则不会发生这种情况且上下文对象为window
。在这种情况下,上下文对象将是该对象。
E.g。
function A() {}
A(); //this points to window
var o = { A: A };
o.A(); //this points to o
每个function
都可以是JavaScript中的构造函数,但您必须使用new
关键字才能获得预期的结果。
为了避免错误,有些人会设计他们的功能,以便忘记new
关键字不会有害,如下所示,但有更好的替代方法来检测这些错误,例如使用代码分析工具,如{{3 }}
E.g。
function Foo(args) {
if (!(this instanceof Foo)) {
return new Foo(args);
}
//initialization code
}
答案 2 :(得分:-2)
试试这个
function Foo(){} var foo1 = Foo();
而不是
function Foo(){} var foo1 = foo();
JavaScript是区分大小写的语言