2016-07-03 25 views
1

私は自己呼び出しのjavascriptファイルを持っており、私はonClickイベントでmoduleIDを取得しようとしています。jQuery自己呼び出し関数は変数にアクセスできませんか?

私はここで間違っていますか?注意すべきもう一つは、私はこれらのファイルのいくつかが「ウィジェット」としてすべて含まれていることです。上記の変数宣言をグローバルにすると、moduleID変数を宣言している他のウィジェットと干渉することになるのでしょうか?

$(function() { 

    // Define our vars 
    var moduleID = 4, 
     output = ''; 

... Some more stuff ... 

}); 

//Listen for button click 
$('[name=adminSearchGo]').click(function() { 
    alert(moduleID); // No Access 
}); 
+0

質問での機能は '.ready()'を呼び出します。 IIFE。 'moduleID'は' .ready() 'ハンドラ内で利用できます – guest271314

+0

異なるスコープのためにアクセスすることはできません。しかし、もし 'moduleID'を要素自体(' data-module-id = "4" ')で保てるなら、' $(this).data( 'module-id') 'または'$(this).attr( 'data-module-id')'となります。 –

+0

または、あなたの 'moduleID'が定義されている前の関数の中で、クリックイベント(' $( '[name = adminSearchGo]')をクリックします) –

答えて

1

関数内で定義されたものは、関数の外ではアクセスできません。

あなたは...あなたはそれが変数を見ることができるようにの内側に結合入れても

$(function() { 

    // Define our vars 
    var moduleID = 4, 
     output = ''; 

    //Listen for button click 
    $('[name=adminSearchGo]').click(function() { 
    alert(moduleID); // No Access 
    }); 

}); 

を行うことができ、このスクリプトを入れて、実行される場所に応じて、あなたの.click外結合が潜在的に動作しません。要素がまだ存在しない可能性があるためです。 の目的は、DOMの準備ができたら関数を呼び出すことです。

+0

私はこの行でちょっと混乱しています。あなたのハンドラは$()コールバックの中にあり、同じスコープになります。 " – SBB

0

これはjavascriptの可変スコープに関するものではありません。あなたはこれを参照することができ
:溶液は、溶媒として
What is the scope of variables in JavaScript?

を、あなたは、これらのファイルは、ウィジェットとして含まれていることを言うので、このモジュール内で一緒に一つのモジュールのすべての行動を置く方が良いでしょう。このように:

$(function() { 

    // Define our vars 
    var moduleID = 4, 
     output = ''; 

    ... Some more stuff ... 


    //Listen for button click 
    $('[name=adminSearchGo]').click(function() { 
     alert(moduleID); 
    }); 
}); 
0

質問の機能は、.ready()(IIFEではなく)を呼び出しています。 moduleIDは、.ready()ハンドラ内で利用可能ですが、をmoduleIDoutputdocumentに割り当ててdocument.data()オブジェクトにアタッチすることもできますが、別の.ready()$(function(){})ハンドラを使用して.data()を設定してください。全てVARS(のような、B、C); $(function(){})

$(function() { 
 

 
    // Define our vars 
 
    var moduleID = 4, 
 
    output = ''; 
 
    $(this).data({ 
 
     "moduleID": [moduleID], 
 
     output: [output] 
 
    }) 
 
    // ... Some more stuff ... 
 

 
}); 
 

 
$(function() { 
 

 
    // Define our vars 
 
    var moduleID = 5, 
 
    output = "abc"; 
 
    $(this).data().moduleID.push(moduleID); 
 
    $(this).data().output.push(output); 
 
    // ... Some more stuff ... 
 

 
}); 
 

 
$(function() { 
 
    // Define our vars 
 
    var moduleID = 6, 
 
    output = "def"; 
 
    $(this).data().moduleID.push(moduleID); 
 
    $(this).data().output.push(output); 
 
    //Listen for button click 
 
    $("[name=adminSearchGo]").click(function() { 
 
    alert($(document).data().moduleID[0]); // No Access 
 
    }); 
 
    console.log($(document).data()) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="button" name="adminSearchGo" value="click" />

0

$(関数(){VARのA、B、C}):現在thisdocumentハンドラ.ready()内で、メモ内部で定義された関数は外部では使用できません。エンクロージャーとして考えることができます。 1. varをグローバルなものとして定義します。 2. "window.xxx = var(a、b、cのような)"のようなvarをエクスポートします。 3. varにアクセスできる関数をエクスポートします。

関連する問題