2017-02-26 109 views
-2

我真的很新的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'沒有用這個範圍來定義。 –

回答

5

結果對其進行訪問您的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

1

這不僅會拋出,因爲f.bar()的錯誤時,纔可訪問 foo的功能範圍(例如它基本上是一個「私人」的方法),而且所有的方法(酒吧, baz,biz)引用屬性「a」,該屬性實際上未被定義爲Foo實例的屬性。

你應該「一」富內使用this.a = a被儲存和使用return this.a