2017-01-05 2 views
-1

thisの値がJavascriptのさまざまなシナリオにあるかどうかを判断するためにいくつかのルールを読みました。下の例が私を捨てるまで、すべてはうまくいっていました。これをJavascriptで使用する

function Person(name){ 
    this.name = name; //this is the object when function used as constructor (as expected) 
    this.changeName = someFunction(); // produces error 

    function someFunction(){ 
    this.nickName = this.name+"by"; //this is now the global object and not the instance, thus the name property does not exist. 

    } 
} 

var a = new Person ('bob'); //error due to the function in changeName property. 

私は理解したものから、this変数は、ドット表記法を介して呼び出されたときに呼び出し元オブジェクトの値を取るか、newキーワードと共に使用した場合、新たに構築関数の値をとります。

誰かが、上記の関数内のこのステートメントが、グローバルobjetであり、新しくインスタンス化されたオブジェクトではない理由を説明することができますか?

答えて

1

上記の関数内のこのステートメントは、グローバルオブジェクトであり、新しくインスタンス化されたオブジェクトではない理由を説明できますか?

あなたはfunc()として(nは結合していない)関数を呼び出すとき(機能がstrictモードである場合やundefined)、thisはグローバルオブジェクトを参照しますので。

各機能(矢印機能を除く)には、それぞれthisという値があります。したがって、Personnew Person()thisPersonと呼ぶということは、新しいオブジェクトを指しており、のの値には影響しません。あなたはどのようにしてsomeFunctionができるかだけが重要です。

あなたはsomeFunctionを呼び出して、明示的に.callを経由してそのthis値を設定できます

this.changeName = someFunction.call(this); 

も参照してください:それは、関数呼び出し内だからsomeFunction()How to access the correct `this` inside a callback?

+0

なぜ私の実装が間違っているのか答えます。ありがとうございました。内部のグローバルオブジェクトであることを認識した時点で私はすでにcall()関数を使用していましたが、なぜそれがグローバルオブジェクトであるのかを知る理由が必要でした。これは私が探していた説明(Y)です。 – alaboudi

0

thisは、グローバルオブジェクトを参照します。 How does "this" keyword work within a function?

問題を解決する場合は、親の中に別名thisを入れてください。

function Person(name){ 
    var self = this; // Store a reference to the current instance 
    self.name = name; 

    self.changeName = someFunction(); // Odd that you'd capture the return value of a setter, ... 

    function someFunction(){ 
    self.nickName = self.name+"by"; //self references the instance, creating the property. 

    } 
} 
関連する問題