0

javascript を使用して開発しているときに異常な動作に気付きました。誰か説明してもらえますか?

私はこれにjavascriptコードを持っています:

function MyFunction(){
   var categoryId = 'abc';
   var that = this;
   $(_elem).parent().find('[data-id]').each(function(){
   that.categoryId += $(this).data('id') + ',';
   });
   setEventsCategoryEx(categoryId, url, parentUrl);
}

これは間違っているはずです。categoryId はグローバルではないため、"that.categoryId" を使用してアクセスできないはずです。

問題は次のとおりです。実行が最初に each メソッドに入ったときに、その .categoryId を出力すると "abc" (ローカルの categoryId 変数に割り当てた値) が生成されます。

マウスが各関数を離れると、 that.categoryId と categoryId は異なる値になります: categoryId = "abc" that.categoryId = "abc+"

次の点がわかりません: これらは別々の変数でなければならないのに、なぜ同じ値で始まるのですか?

ありがとう、オスカー

編集: 申し訳ありませんが、コピーして貼り付けるときに、関数宣言を追加するのを忘れていました。「onclick」イベントによって呼び出される関数内にあります。

4

2 に答える 2

2

関数内にいない場合var categoryId = 'abc'は、 と同じ効果がありwindow.categoryId = 'abc'ます。

関数内にいない場合はthiswindow

したがって、表示されるのは予想される動作です。

このライブの例については、js コンソールを参照してください

編集: 申し訳ありませんが、コピーして貼り付けるときに、関数宣言を追加するのを忘れていました。「onclick」イベントによって呼び出される関数内にあります。

編集後、問題を再現できません

于 2012-08-13T15:46:37.527 に答える
0

非厳密モードでメソッドとして使用されていない関数を呼び出すとthis、グローバル オブジェクトになります。

言語仕様のセクション 11.2.3 には次のように記載されています。

プロダクションCallExpression : MemberExpression *Arguments* は次のように評価されます。

6. If Type(ref) is Reference, then
     If IsPropertyReference(ref) is true, then
       Let thisValue be GetBase(ref).
   Else, the base of ref is an Environment Record
     Let thisValue be the result of calling the ImplicitThisValue concrete method of GetBase(ref).
于 2012-08-13T15:49:36.353 に答える