有什么区别:
function Foo(){} var foo1 = Foo();
和
var foo2 = new Foo()
据我测试, foo1 什么也没提供。typeof foo1 未定义,而使用 new 则可以按预期进行。
没有 new 关键字我得到未定义结果的原因是什么?
有什么区别:
function Foo(){} var foo1 = Foo();
和
var foo2 = new Foo()
据我测试, foo1 什么也没提供。typeof foo1 未定义,而使用 new 则可以按预期进行。
没有 new 关键字我得到未定义结果的原因是什么?
这是因为隐式function Foo(){}
返回undefined
,即如果函数没有显式返回语句,编译器/VM 将隐式添加它。但是,当您使用new
关键字时,您会从构造函数中实例化一个对象。
有关关键字作用的确切解释,请参见此答案。new
这是您在使用时基本上发生的事情new
,它:
o
.o
为[constructor].prototype
。[constructor]
witho
作为上下文对象 ( this
)。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
}
尝试这个
function Foo(){} var foo1 = Foo();
代替
function Foo(){} var foo1 = foo();
JavaScript 是区分大小写的语言