1

以下は私のコードです -

(function($){
obj = {
    alertText: function(){
        console.log('Called');
    },
    testFunc: function(){
        console.log(this);
        this.alertText();
    },
    checkFunc: function(){
        inner();
        function inner(){
            console.log(this);
            this.alertText();
        }
    }
}})(jQuery)

を呼び出すとtestFunc()thisキーワードalertText()を介して適切に呼び出されます。

ただし、関数を呼び出した後、これalertText()を使用する呼び出しは内部で失敗します(this.alertText は関数ではないことを示す TypeError) 。inner()checkFunc()

上記のようにこれをコンソールすると、その中にさまざまなコンテンツが表示されます.1つtestFunc()は object を表示objし、1つinner()は object を表示しWindowます。

これはなぜですか?これが 2 つの場所で異なる意味を持つのはなぜですか?

4

1 に答える 1

1

javascriptのthisキーワードは、呼び出しコンテキストに依存し、複数のセマンティックを持ちます。これは、Javascript の最も複雑で奇妙な機能の 1 つです。@DarkCthulhu のリンクを読むことができます。

thisjavascript では、オブジェクトを定義する方法が 3 つあります。この回答でも説明されています。

  1. someThing.someFunction(arg1, arg2, argN)
  2. someFunction.call(someThing, arg1, arg2, argN)
  3. someFunction.apply(someThing, [arg1, arg2, argN])

オブジェクトなしで内部関数を呼び出すとthis、グローバル オブジェクトを指します。forとは、thisに割り当てる現在のオブジェクトです。checkFunctestFuncobj

問題を解決するには、外側の関数で を作成し、内側の関数var that = thisで使用thatします。Crockford のアドバイスです ;-)

于 2013-06-22T21:17:11.400 に答える