2012-02-14 8 views
3

innerFに誰かが精緻化できますか?thisは何を参照していますか? UserまたはinnerFこれは何を意味するのか理解しています

function User(){ 
    this.id = 1; 
}; 

User.prototype.sayHi = function(){ 
    var innerF = function(){ 
     this.id = 2; // "this" refers to User or innerF ? 
    }; 

    return innerF; 
}; 

またnewキーワードまたは匿名機能thisキーワードの参照を変更することに関係していていますか?おかげ

+0

へのIDを変更しましたか? :) –

+1

@Topener:私はそれを試して、JSを学ぶ方法を知らない: – Dev555

+0

@Topener:私はそれを呼び出すことができたように見えます。 – Dev555

答えて

6

thisローカルがinnerFの内部を参照する内容は、最終的にどのように機能が呼び出されるかによって異なります。それはthisの意味を変えるさまざまな方法で呼び出すことができます。例えば

あなたが thissayHiが呼び出された Userのインスタンスを参照したいことが表示されますけれども、あなたのコードに基づいて
var u = new User(); 
var innerF = u.sayHi(); 
innerF();    // 'this' is window 
innerF.call(u);  // 'this' is 'u' 
innerF.call("hello"); // 'this' is "hello" 

。その場合は、thisをローカルに保存し、そのローカルをinnerFに参照する必要があります。

User.prototype.sayHi = function(){ 
    var self = this; 
    var innerF = function(){ 
     self.id = 2; 
    }; 

    return innerF; 
}; 

sayHi内部そのthisもののいずれかUserインスタンスを指すように保証されません。一般的にはsayHiと同じトリックが行われ、innerFに行われます。例えば

var sayHi = u.sayHi; 
sayHi(); // 'this' is window 
+0

ありがとうございますが、私は 'this'を' innerF'を参照したいと思います。それを実行するためのコードも用意されています。 – Dev555

+0

ありがとうございました:) – Dev555

+0

@ Dev555: 'this'は関数自体を参照しますか?なぜ、 'this'の代わりに' innerF.id = ... 'を使わないのですか? –

2

var u = User; 
var f = u.sayHi(); 
f(); 

それとも

var u = new User; 
var f = u.sayHi(); 
f(); 

あなたはそのコード内の関数を呼び出していないので、それが参照していない:私はこのようにそれをすべてを呼び出す場合はどう

まだ何かに。

の値をと呼びます(bindなどを使用しない限り)。

+0

呼び出しが 'this'の参照にどのように影響するかを詳しく説明できますか?コード付き。おかげで – Dev555

+0

@ Dev555:いくつかの調査をして、いくつかのドキュメントを読んでください:https://developer.mozilla.org/ja/JavaScript/Reference/Operators/this –

1
var u = User; 
var f = u.sayHi(); 
f(); 

ために上記のコードはエラーをスローします。 Userは関数であり、Userオブジェクトではないので、メソッドsayHiを持たないので、以下のエラーが発生します。

Uncaught TypeError: Object function User(){ 
    this.id = 1; 
} has no method 'sayHi' 

var u = new User; 
var f = u.sayHi(); 
f(); 

ので、上記のコードはエラーをスローしないだろう、とuUserの目的である、(how new worksfrom mdn)、そしてこの方法は関数を返しsayHi、そしてあなたがf();によって機能を実行するのです関数内にあるthisは、関数が呼び出されるときに現在のコンテキストを参照します。したがって、コードがグローバルスコープにある場合、thiswindowオブジェクトを参照しています。

そして、あなたはf.call(u);でコンテキストを設定することができ、その後、thisは、オブジェクトu言及している、とあなたはなぜあなたがしようとしていないユーザーオブジェクトu 2.

関連する問題