14

JavaScriptthis参照の状況で混乱します。

オブジェクトメソッド内で関数を宣言するコードに取り組んでいます。(その理由は、関数をメソッドに対してプライベートに保ちながら、オブジェクト メソッド内のコードを整理するためです。)

以下は、私の問題を再現するための実験です。

thisinsidegreeting関数がpersonスコープではなくwindowスコープを参照していることがわかりました。

var person = {
    nickname: "Makzan",
    sayHi: function() {
        console.log(this);
        var greeting = function() {
            console.log(this);
            return "Aloha " + this.nickname;
        }
        console.log(greeting());
    }
}
person.sayHi();

(jsfiddle の同じコード: http://jsfiddle.net/makzan/z5Zmm/ )

そして、これはブラウザのログ結果です:

> Object
> Window
Aloha undefined 

JS では、この参照がトリッキーであることはわかっています。メソッドを使用してスコープを変更し、.callこのコードを機能させることができます。

var greeting = (function() {
    console.log(this);
    return "Aloha " + this.nickname;
}).call(this);

ただし、デフォルトでグリーティングメソッド内のウィンドウスコープをthis参照する理由を知りたいです。

ご協力いただきありがとうございます。

4

3 に答える 3

12

thisscopeとは何の関係もありません。コンテキストによって決定されます。

greeting()コンテキストなしで関数を呼び出すためthis、デフォルト オブジェクト (windowブラウザー内) です。

于 2013-04-05T10:27:50.530 に答える
4

this参照はスコープに関係なく、呼び出しコンテキストに依存します。

MDN docに従って、

一般に、現在のスコープで this にバインドされているオブジェクトは、現在の関数がどのように呼び出されたかによって決まります。

于 2013-04-05T10:29:44.427 に答える
2

person.nickname を試してください。これは、あなたの場合の var greeting を指します。

于 2013-04-05T10:27:40.650 に答える