3

私はjavascriptに関するいくつかの新しい概念を学ぼうとしています.Hereは私が書いた簡単なコードです. 関数内の THIS キーワードは、別のオブジェクトのコンテキストにバインドされていない限り、window であるグローバル オブジェクトを参照します。オブジェクト内には 2 つのメソッドがあり、それぞれ と とmyobj呼ばれる別の 2 つのグローバルにアクセス可能な関数と同じ名前を共有しています。myobj コンテキスト内でこれらのグローバル関数にアクセスしたいのですが、もちろん、それらを呼び出すために使用したすぐに呼び出される関数にバインドするグローバルオブジェクトを使用する必要はありません。しかし、それはエラーを投げています。私の質問は、JavaScriptのすべてがオブジェクトであり、ウィンドウオブジェクトがそれらを保持している場合、またはを使用してこれらの関数にアクセスできるのはなぜですか?afuncanotherfuncthis.afucnwindow.afunc

(function(){
var afunc=function (){
    document.write('this is world'+'</br>');
}
var anotherfunc=function (){
   document.write('this is another world');
}
   var myobj={
       afunc:function(){
	        document.write('afunc');
	   },
	   anotherfunc:function(){
	        document.write('anotherfunc');
	   },
	   context:function(){
	       (function(){
		       this.afunc();
			   this.anotherfunc();
		   })();
	   }
	 };
   myobj.context();
})();

4

3 に答える 3

2

あなたの場合、thisグローバルオブジェクトを参照しthis.afunc()、などがグローバル変数にアクセスすることは事実ですafunc

ただし、表示するコードが他にない限り、グローバル変数はありませんafunc。で定義した変数

(function(){
var afunc=function (){
    document.write('this is world'+'</br>');
}
var anotherfunc=function (){
   document.write('this is another world');
}
//...
})();

囲んでいる関数 (パーツ)に対してローカルです。(function(){ ... })();

それらをグローバルにしたい場合は、関数の外に移動するだけです:

var afunc = function() {
    document.write('this is world' + '</br>');
};
var anotherfunc = function() {
    document.write('this is another world');
};
(function() {
    var myobj = {
        afunc: function() {
            document.write('afunc');
        },
        anotherfunc: function() {
            document.write('anotherfunc');
        },
        context: function() {
            (function() {
                this.afunc();
                this.anotherfunc();
            })();
        }
    };
    myobj.context();
})();


ただし厳格モードでは、グローバル オブジェクトを参照しないthisことに注意してください。undefinedこれが行われたのは、通常、誰かがthis関数内で使用する場合、それがグローバル オブジェクトを参照することを期待していないためです。コードを見ただけでは、( 経由で) グローバル オブジェクトにアクセスしたいのか、それとも他のオブジェクトにアクセスしたいのかが常に明確であるとは限りませthisん (お気づきのように、意図について混乱がありました)。

そのため、グローバル オブジェクトにアクセスする場合は、明示的にアクセスし、 経由で参照する必要がありますwindow

于 2014-10-14T13:46:02.707 に答える
0

thisが参照していると思われるものを参照していないため、機能していませんwindow。そこから、関数は 内にラップされているため、完全にグローバルスコープ内にあるわけではありません(function(){ ... })();。あなたのcontext関数でfunction()は、グローバル スコープには何もないため、ラッパーは必要ありません。

   context:function(){
       (function(){ // <-- Here
           this.afunc();
           this.anotherfunc();
       })(); //        <--
   }

それを削除し(とにかく必要ありません)this、のインスタンスを参照しますmyobj

   context:function(){
       this.afunc();
       this.anotherfunc();
   }

スコープ外で宣言されたものを取得したい場合はmyobj、 を使用したくありませんthis。のインスタンスに属する関数を意味するからですmyobj。あなたはただ言いたい:

   context:function(){
       afunc();
       anotherfunc();
   }

myobj「グローバル」機能について知らないからです。

(function(){
var afunc=function (){
    document.write('this is world'+'</br>');
}
var anotherfunc=function (){
   document.write('this is another world');
}
   var myobj={
       afunc:function(){
	        document.write('afunc');
	   },
	   anotherfunc:function(){
	        document.write('anotherfunc');
	   },
	   context:function(){
               afunc();
               anotherfunc();
	   }
	 };
   myobj.context();
})();

于 2014-10-14T13:33:25.870 に答える