以下JavaScript代码的输出是什么?为什么?

以下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(); 
+2

结果是错误。 f.bar不是一个函数。这是因为它是一个仅在Foo函数中具有作用域的本地函数。 'baz'是可用的,因为当你执行'new Foo()'时,它是构造对象的一部分。 'f.biz()'也可用,因为它被放置在Foo的原型中,这意味着Foo的所有实例(f都是其中之一)共享它。 – rasmeister

+0

作为@rasmeister说的继续:'f.baz'返回'a'('7')的值,但是'foo.biz'返回'undefined',因为'a'没有用这个范围来定义。 –

结果对其进行访问您的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