1

私が理解しているように、変数が定義されると、それは。を介して「最も近い」ローカルスコープにアタッチされますthis

ローカルにスコープが設定されていない場合、最も近いスコープはになりwindowます。

ただし、厳密モードでは、グローバルスコープの誤用を制限するように設計されたECMAscript 5仕様の一部としてwindow、ローカルスコープがではなく未定義に設定されます。


jQueryプラグインを作成するための即時呼び出し関数式パターンと厳密モードの使用

;( function( $, window ){
   "use strict";
   var myScope = this;
   var myVar = 1;

   var myFunction = function(){
     console.log( myScope, myVar );
   } 

   $.myFunc = myFunction;

})( jQuery, window );

ローカルスコープ(コンテキスト)は(関数呼び出しを介して)作成されないため、未定義に設定されます。

ローカルスコープが未定義で未定義の場合window.myVar、変数のスコープは何myVarですか?また、どのようにアクセスしますか?

4

2 に答える 2

2

ECMAscriptがその下に字句スコープを実装する方法に関しては、スコープthis context variableとは何の関係もありません。

thisは常に呼び出しのオブジェクトを参照します。これは実行時に変更される可能性がありますが、スコープ/コンテキストは変更できません。そこに2つの関数呼び出しがあり、それぞれに独自の実行コンテキストと独自のアクティベーションオブジェクトがあります。これらはそれぞれ、正式なパラメーター、変数、関数宣言などのローカルデータを格納するために実装によって使用されます。


ここで実際に達成しようとしているのは、データを保持するためのコンテナーとして機能するハッシュ/名前空間オブジェクトを作成することです。したがって、を割り当てるのではなく、独自のオブジェクトthisを作成するだけです。

var myScope = { };  // respectively Object.create( null );

strictモードでは、実装は、そのまま呼び出されたすべての関数に対して設定thisます。つまり、の値は、関数がどのように呼び出されるかによって決まります。あなたの場合、それは自己実行関数であり、したがって、それは常に厳密モードにあり、(グローバル非厳密モードになります。undefinedthisthisundefinedwindow

于 2013-01-19T19:25:26.380 に答える
1

myVar包含クロージャにスコープされます。コードを実行してから$.myFunc()を実行すると、そのクロージャーにまだ存在しているundefined 1ため、出力はです。ただし、クロージャーの外側myVarからアクセスする方法はありません。myVarこれは、JSでプライベート変数を実装するために使用されるのと同じメカニズムです。

@jAndyが言っていることも真実でthisあり、スコープとは無関係であり、この場合、this無名関数のはundefined

于 2013-01-19T19:32:41.507 に答える