以下JavaScript代码的输出是什么?为什么?
问题描述:
我真的很新的JavaScript。你能解释一下什么是下面的JavaScript代码的输出?请尽可能详细地解释原因。非常感谢。以下JavaScript代码的输出是什么?为什么?
var Foo = function(a) {
function bar() {
return a;
}
this.baz = function() {
return a;
};
};
Foo.prototype = {
biz: function() {
return a;
}
};
var f = new Foo(7);
f.bar();
f.baz();
f.biz();
答
结果对其进行访问您的Foo方法(酒吧,巴兹,BIZ)内是错误的。 f.bar不是一个函数。这是因为它是一个仅在Foo函数中具有作用域的本地函数。它实际上是一个私有函数,仅在其定义的函数中可用。
当您调用新的Foo()时,您将调用该函数作为构造函数。这将创建一个对象并将其返回。在该对象可以被引用为'this'的函数内。由于baz
作为属性添加到this
对象,因此它将包含在您执行f = new Foo(7)
时创建的对象中。
baz是可用的,因为它是您创建新的Foo()时构造对象的一部分。
f.biz()也可用,因为它被放置在Foo的原型中。添加一个原型,这意味着Foo的所有实例(f是其中之一)共享一个原型。
变量a只在构造函数中定义,因此它在biz()函数调用中将是未定义的。因此,f.biz()将返回undefined
。
答
这不仅会抛出,因为f.bar()的错误时,才可访问内 foo的功能范围(例如它基本上是一个“私人”的方法),而且所有的方法(酒吧, baz,biz)引用属性“a”,该属性实际上未被定义为Foo实例的属性。
你应该“一”富内使用this.a = a
被储存和使用return this.a
结果是错误。 f.bar不是一个函数。这是因为它是一个仅在Foo函数中具有作用域的本地函数。 'baz'是可用的,因为当你执行'new Foo()'时,它是构造对象的一部分。 'f.biz()'也可用,因为它被放置在Foo的原型中,这意味着Foo的所有实例(f都是其中之一)共享它。 – rasmeister
作为@rasmeister说的继续:'f.baz'返回'a'('7')的值,但是'foo.biz'返回'undefined',因为'a'没有用这个范围来定义。 –