2016-09-01 7 views
0

以下のfoo関数がnewで呼び出されると、bazに割り当てられたオブジェクトを返すコンストラクタ関数に変わります。 bazは機能がbazが割り当てられていない返すまで、新しいfooは()が呼び出されたときに、掲揚しまっながらと言うことは正しいことでしょう -新しいキーワードを使用したJavascript - 関数コンストラクタ

function foo() { 
    this.baz = "baz"; 
    console.log(`${this.bar} ${baz}`); 
} 

var bar = "bar"; 
var baz = new foo(); // prints undefined undefined 

質問は、コンソール文の内部bazundefined値を取得する理由であります返されたオブジェクト?

console.log(baz)以降の行では、返されたオブジェクトが正しく出力されます。

答えて

1

変数bazは、コンストラクタを実行する時点では存在しません。 bazは、コンストラクターの実行後に作成されます。

それは同様にあなたが生命維持を使用した場合に動作します:

var test = (function() { 
    console.log(test) // undefined 
    return 'test' 
}()) 
console.log(test) // 'test' 
2

thisには、barはありません。 this.barthis部分を削除する必要があります。 bazの場合、this.bazはオブジェクトインスタンスに関連付けられているため、使用する必要があります。

function foo() { 
 
    this.baz = "baz"; 
 
    console.log(`${bar} ${this.baz}`); 
 
} 
 

 
var bar = "bar"; 
 
var baz = new foo();

このコードは、オブジェクトを作成するとき、それはそれでだけ bazを持っていることを

this.baz = "baz"; 
console.log(`${this.bar} ${baz}`); 

を意味します。本文では、オブジェクトのプロパティにアクセスする場合は、thisでアクセスする必要があります。 baz変数がないため、${baz}は未定義です(thisでは表示されません)。関数内のbazにアクセスする必要がある場合は、this.bazを使用する必要があります。

${this.bar}は、thisにはbarという特性がなく、bazにのみ存在します。

+0

あなたの答えを前提とすると、コードを修正する必要があります。修正を探すのではなく、その動作の説明の確認。 – user3206440

0

MDN linkは、あなたが何this手段を理解するのに役立ちます。

関数内で使用されます。これは、現在のオブジェクトを参照します。その が実際に何を意味しているかは、それを 関数と呼んでいます。 のドット表記法または角かっこ表記を使用してオブジェクトを呼び出すと、そのオブジェクトがこれになります。コールの にドット記法が使用されなかった場合、これはグローバルオブジェクトを参照します。

したがって、function foo()の中にthis.barを呼び出しています。関数foo()にはbarプロパティがないため、undefinedが得られます。

またbarfunction foo()の中に呼び出すと、barプロパティの検索が開始されます。
最初にfunction foo()の内側にあり、globalにバープロパティがある場合はそれを検索します。

関連する問題