2016-03-28 13 views
-1

ここに見られるようにHow to access the correct `this` context inside a callback?私はこれの代わりに自己を使用しようとします。 JSについて少し愚かな質問ですが、私はいくつかの説明をしたいと思います。JSこれと自己は動作しません

(function (global) { 

    "use strict"; 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

そして、私は間違っていますか?私はところでコルドバの内側にこのコードを使用しています...エラーは、次

Uncaught TypeError: Cannot set property 'test' of undefined 
+2

「これは」と何が期待されますか? –

+0

私はそれがparamsを使用しないそれらの関数の間で物事を共有する方法であると思いますか? :D – user2391356

+0

代わりに 'closure'を使うか、' use strict'を削除してください。 strictを削除すると 'this 'を介して' window'にアクセスできます。 –

答えて

7

strictモードでthisの値を使用して通常の関数呼び出しはundefinedです。それはまさにあなたの状況です。あなたの機能:

(function (global) { 

    "use strict"; 
    var self = this; 
    ... 

})(window); 

のでthisは未定義になり、通常の関数呼び出しのです。 strictモードを使用しない場合は、通常の関数呼び出しでthisがグローバルオブジェクトに設定されます。そうでない場合、thisは、関数が別の方法(new.apply()または.call()またはobj.method()など)で呼び出されたときにのみ、一意の値に設定されます。


self回避策thisが既に所望の物体を指し、あなたはコールバックで後で使用するためにその参照を保存する場所は、使用している状況にあります。あなたのコードではそうではないので、あなたのコードにthisを使用することが期待されていることは明らかではありませんが、あなたがしようとしているオブジェクトの詳細な説明なしにあなたの問題を解決するために推奨するものを使用するのは明確ではありません参照。

グローバルオブジェクトだけを参照する場合は、コード内でglobal.testを参照するだけで済みます。

(function (global) { 

    "use strict"; 

    function onDeviceReady() { 
     global.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(global.test); 
    } 
})(window); 

あなたには、いくつかの他のオブジェクトを指すようにthisを期待している場合、あなたは、あなたがそれを指すように期待しているかを説明する必要がありますし、我々はあなたにその特定を参照する方法のアイデアを提供することができますオブジェクト。


"use strict";」を削除しては機能しません。 strictモードを使用しているときにコードが正しく動作しないという事実は、あなたのコードが保護するように設計された悪い練習を使用していることを意味します。代わりに、strictモードを引き続き使用してください。代わりに、悪い習慣の使用をやめて、strictモードで正しく動作するようにコードを修正してください。今後の参考のために


、あなたはJavascriptが関数呼び出しの内部にthisを設定するかを決める方法を学習したい場合は、この答えは読むことができます:When you pass 'this' as an argumentを。その答えは、thisの値が決定される5つの異なる方法をリストしています。

1

ちょうど"use strict";行を削除します:

(function (global) { 
    var self = this; 

    function onDeviceReady() { 
     self.test = "123"; 
     loadMapsApi(); 
    } 
    function loadMapsApi() { 
     console.log(self.test); 
    } 
})(window); 

Fiddle

+0

LOL!だから簡単に..ああ、ありがとう! :)なぜ私はそこに1つを忘れているのか分からない – user2391356

+0

@ user2391356いいえprob! :) – PDKnight

+0

@ user2391356 - これはお勧めできないので、実行しないでください。 '' strict strict ''を使うのは良いことです。そして、それを削除すると、あなたのコードが悪い習慣を使っていることを意味するあなたのコードが動作します。厳密なモードはあなたを守ります。代わりに '' strict strict ''を使うようにコードを修正する必要があります。 – jfriend00

関連する問題