2017-02-26 11 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はそれらのうちの1つ)によって共有されるため、使用できます。 – rasmeister

+0

'a'がそのスコープで定義されていないため、' f.baz'は 'a'(' 7')の値を返しますが 'foo.biz'は' undefined'を返します。 –

答えて

5

を使用して、Fooのメソッド(バー、バズ、BIZ)内側にアクセスするの内側に収納されなければなりません。 f.barは関数ではありません。これは、Foo関数内でのみスコープを持つローカル関数であるためです。実質的には、それが定義されている関数内でのみ使用可能なプライベート関数です。

新しいFoo()を呼び出すと、その関数をコンストラクタとして呼び出すことになります。これは、オブジェクトを作成し、それを返します。関数内では、オブジェクトは 'this'として参照できます。 bazはプロパティとしてthisオブジェクトに追加されているため、f = new Foo(7)を作成したときに作成されたオブジェクトに含まれます。

新しいFoo()を実行すると、構築されたオブジェクトの一部であるため、bazが使用できます。

f.biz()は、Fooのプロトタイプに配置されているため、利用可能です。プロトタイプを追加することは、Fooのすべてのインスタンスによって共有されることを意味します(fはその1つです)。

変数aは、コンストラクタ関数内でのみ定義されているため、biz()関数呼び出しでは定義されません。したがって、f.biz()はundefinedを返します。

1

だけでなく、これは(f.barので、エラーがスローされます)のみアクセス可能内部のFoo関数スコープ(例えば、その基本的には「プライベート」メソッド)だけでなく、すべてのメソッド(バー、ですbaz、biz)は、実際にFooインスタンスのプロパティとして定義されていないプロパティ "a"を参照します。

あなたは「」fooがthis.a = aを使用して、その結果が誤りであるreturn this.a

関連する問題