2012-02-13 5 views
0

これはおそらくかなり簡単ですが、私は混乱しています。私は、次の操作を実行しようとしています:JavaScript 'this' confusion

var myObj = {}; 
myObj.src = {} 
myObj.src.A = ['1.png','2.png','3.png']; 
myObj.A = new Image(); 
myObj.A.src = this.src.A[0]; 

これはUncaught TypeError: Cannot read property 'A' of undefinedエラーになります。 thisの代わりにmyObj.src.A[0]を使用するとうまくいきます。

これをこのコンテキストで使用する正しい方法は何でしょうか?

+0

「このコンテキストでこれを使用する正しい方法は何ですか?」あなたはあなたの文脈が何であるか私たちに見せてください... –

+2

'this'は何を参照すると思いますか?なぜですか?あなたが投稿したコードから、*私はそれが* myObjではないことを伝えることができます。 – Pointy

+0

なぜ 'this'は' myObj'を参照すべきだと思いますか? https://developer.mozilla.org/ja/JavaScript/Reference/Operators/thisを読んでください。投稿したコードから、 'this'を使う必要はありません。 –

答えて

1

thisキーワードを持っていないDOM windowに言及されている可能性がある関与範囲に応じて、常に異なっています。上記のコードスニペットでは、頭の中のどこかのドキュメントにこれを置いていると仮定すると、thisはページ自体を参照しています。その点では、this.src.Aが未定義であることはかなり明らかです。次のようなデリゲートでそれにイベントを適用した場合:

myObj.click = function() { 
    alert(this.src.A[0]); 
} 

thisキーワードは、デリゲート(この場合はこのmyobj)の所有者に属する新しいスコープを受け取ります。 thisは、スコープとスコープ境界を明確に定義する限り、追跡が非常に簡単です。

3

は、コードが実行されているオブジェクトコンテキストを指します。したがって、あるオブジェクトにメソッドaMethodがある場合は、aMethodthisの中に、それを所有するオブジェクトが参照されます。

あなたのコードはグローバルネームスペースで実行されていると仮定していますので、thisは未定義です。実際にはmyObj.A.src = myObj.src.a[0];がほしいだけです。 thisは、その直接の親を参照しているため

http://www.quirksmode.org/js/this.html

-1

myObj.src.A[0]は、この文脈で正しいでしょう。

+2

*' this'は、 ...その親は? 「関数コンテキスト」とローカル変数との間には、このような関係はありません。 –

+0

'this'の親です。それは相対的なものです。 =) – Donnie

+0

だから 'this'は' this''親を参照していますか?それはもっと混乱します... –

1

thisコードの場合はvar myObjを参照していません。あなたが関数のスコープやオブジェクトメソッド内でないならば、this何の属性src.A

1

thisは、関数が呼び出されるコンテキストに大きく依存します。ページ内のスクリプトタグにあなたのコードがぶら下がっている場合は、thisが「グローバル」コンテキスト(ブラウザではwindowオブジェクト)になります。

一般に、thisは、関数が属するオブジェクト/スコープを指しますが、関数はさまざまなオブジェクトに割り当てられ、さまざまなコンテキストで呼び出すことができるファーストクラスの値なので、いくつかの特別なケースがあります。

いくつかの長い推敲他の人が役に立つかもしれません書かれている:それは特に、開始時に少しトリッキーに見えることができ

あなたが言語に慣れているならthisです。常にですが、いくつかのルールを学ぶと、かなり簡単で実際には非常に便利になります。