2011-07-13 7 views
4

私はいくつかのJavaScript開発を行っており、この問題が発生しました。次のコードを検討してください。このキーワードJavaScriptの仕組みは?

var obj = {}; 
obj.bind = function() { 
console.info(this); 
}; 

obj.bind(); 

私はFireBug JavaScriptコンソールでコードを実行しています。予想される結果は、thisがコンソールへのオブジェクトへの参照を表示することです。

実際にはundefinedと表示されます。私は私のコード

var obj = {}; 
obj.bind = function() { 
this.x = 'x'; 
console.info(this); 
}; 

obj.bind(); 

に、この変更を行う際

しかし、今コンソールはobjオブジェクトへの参照ですthisの期待値が表示されます。

どうしてですか?

+3

私はChromeのデベロッパーコンソールの最初の例を試してみましたが、それが表示されました期待どおりのオブジェクト。おそらくこれはFirebugのバグですか? –

+1

コンソールにはいくつかのことがあります。一例は、 'delete'を使って変数を削除することです。コンソールではなく、外部で動作します。 – alex

+0

@Jeremyいいえ、そうではありません。 「未定義」と表示されます。 Chromeはオブジェクトを表示しますが、これはChromeが実行するためであり、 'console.info'機能のためではありません。オブジェクトの下を見ると、定義されていない単語が見つかります。 –

答えて

3

undefinedは、値を明示的に返さないために取得する関数の戻り値です。

ChromeとFirebugの両方で、戻り値undefinedの前にオブジェクトをコンソールに正しく表示します。

あなたが行うのであれば:それは空になったときにFirebugのは、オブジェクトが表示されていない場合は、あなたがにチェックする必要があるかもしれません

Object { } 
"foo" 

var obj = {}; 
    obj.bind = function() { 
    console.info(this); 
    return "foo"; 
}; 

obj.bind(); 

を...あなたのようなものが表示されるはずです最新バージョンを使用していることを確認してください。

-1

例では、いくつかのコメント者が指摘したように、「this」はobjである必要があります。ここに理由を説明する詳細です - Javascriptを、関数を呼び出す方法に応じて、「この」の値が変化して

を:

  1. 関数はオブジェクトのプロパティとして格納され、 obj.foo()を呼び出してその関数を呼び出すと、 "this"はobjになります。

EX:

var obj = { 
    x: 1, 
    increment: function() { 
    this.x = this.x + 1; 
}; 

obj.increment(); // Makes "this" be obj 
  1. ご所有のオブジェクトを参照していない構文を使用して関数を呼び出すと、「これは」地球環境となります。

EX:関数を呼び出すと、それはnew演算子を使用して、コンストラクタであるかのように

function someFunc(a, b) { 
    return a + b; // If you were to refer to "this" here, it would be the global env. 
} 

someFunc(5, 6); 
  1. 、新しいオブジェクトがあなたのためにインスタンス化され、「これは」を指すようになりますその新しいオブジェクト。

EX:あなたが呼び出しを(使用する場合

  1. )または(適用)、あなたは "これは" であるかを制御することができます

    function SomeConstructor() { 
        this.x = 42; // under the hood, a new object was instantiated for you, and "this" was set to it. 
    } 
    
    var result = new SomeConstructor(); // note the "new" keyword 
    

    //結果は{42、X}になります。

(それはかなり遠くあなたの質問からだ、ここでは例以来。たとえば適用()または()の呼び出しのためのドキュメントを検索します。)

+0

ES5厳密モードを除いて、* this *がオブジェクトに解決されない場合はそのまま残し、グローバルオブジェクトには設定されません(ES5§10.4.3)。 – RobG

+0

はい、良い点。彼らは最終的にいくつかのことを修正しています。 –

+0

誰もがdownvoteを説明したいですか?何が間違っているのかは分かりませんが、何かがあれば修正したいと思います。 –