0

別の関数で使用したい変数がありますが、それを正しく呼び出す方法がわかりません。外部 JS ファイル:

<script>
function search ()
{
var subscriptionId = "";

if (document.getElementById('deleteyes').checked)
 {
  alert(subscriptionId);
 }
}
<script>

HTML ファイル:

<script>
$(document).ready(function() { 
    $.getJSON(ravenUrl + '/indexes/dynamic/Subscriptions?query=Email%253A' + email, function(json) {
        subscriptions = json.Results;
        var html = '';
        for (var i in json.Results) {
            html += '<option value="' + i + '">Edit "' + json.Results[i].Name + '"</option>';
        }
        $('#subscriptionSelector').append(html);
    });

    $("#subscriptionSelector").change(function() { //alert('#forumSelector');
    var subscriptionIndex = $(this).val();
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    alert(subscriptionId);
    });
}
</script>



    <body>
<script type="text/javascript" src="externaljsfile.js"></script>
                                                        <p>create / edit subscription</p>
                                                            <select id="subscriptionSelector"><option selected="true" value="-1">Create new</option></select>
                                                <p>delete subscription</p>
     <div style="margin-left:35px;margin-top:6px;float:left;"><input type="radio" name="delete" id="deleteno" class="div1" checked />no</div>
    <div style="margin-left:35px;margin-top:6px;float:left;"><input type="radio" name="delete" id="deleteyes" class="div1"/>yes</div>

        </body>

アラート (subscriptionId) は HTML ファイルから JavaScript で正しく生成されますが、外部 js ファイルのアラートは明らかに正しいサブスクリプション ID を生成していません。

これは非常に単純な問題かもしれませんが、JavaScript に関連する問題の答えを見つけるために検索を実行することさえできないスキル レベルであるため、しばらくお待ちください。前もって感謝します。

4

7 に答える 7

1

ここでの問題はスコープの1つでありsubsriptionId、関数スコープで(正しく)宣言しています。ただし、その関数が戻るとすぐに、その変数はGCされます(ガベージコレクション)。

@GungFooが言ったように、最初は、変数をグローバルに宣言すると(したがって、変数をGC化することは決してない)、問題が修正されると思うかもしれません。しかし、すぐにグローバルスコープを汚染して問題が発生する可能性があります。たとえば、別の関数が依存している変数の値を誤って変更する可能性があります。この問題に関するいくつかの記事をグーグルで検索すると、これが適切でない理由がすぐにわかります。

いくつかの選択肢:

「その他の関数」がグローバルスコープで定義されていると仮定すると、プロパティを割り当てることができます。

function()
{//this declares and assigns subscriptionId
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    theOtherFunction.subscId = subscriptionId;//assign property
    alert(subscriptionId);
}
//the other one
function theOtherFunction()
{
    alert(theOtherFunction.subscId);//will alert the correct value
}

さらに簡単なのは、jQueryを使用することです。

function theOtherFunction()
{
    var id = subscriptions[$("#subscriptionSelector").val()]["@metadata"]["@id"].substring(7);
    alert(id);//will work, too
}

後者の欠点は、特定の要素()を見つけるために、呼び出しごとにDOMがスキャンされること$("#subscriptionSelector")です。これを修正するには、クロージャーを使用できます。

var theOtherFunction = (function(selector)//takes DOM element as argument
{
    return function()//this is the actual function
    {//thanks to closures, selector will not be GC'ed
        var id = subscriptions[selector.val()]["@metadata"]["@id"].substring(7);
        alert(id);//works like a charm
    };
})($("#subscriptionSelector"))//pass DOM element as argument

最後のアプローチは、最初は少し気が遠くなるように思えるかもしれませんが、IIFE、クロージャ、スコープの魔法について読むのに少し時間を費やしてください。これはJSの最高の機能の1つであり、非常に強力であり、基本的な概念を理解すればそれほど難しくはありません。

于 2012-10-16T13:46:32.697 に答える
1

subscriptionId最も簡単な解決策は、グローバル スコープで宣言することです。

それは「の外側search()」を意味します:

var subscriptionId = "";

function search ()
{

if (document.getElementById('deleteyes').checked)
 {
  alert(subscriptionId);
 }
}
subscriptionId = "what?";
search();
于 2012-10-16T13:31:56.877 に答える
1

変数宣言を関数の外に置くvar subscriptionId = "";(グローバル変数)

その後、他の関数からこれにアクセスできます。

于 2012-10-16T13:32:47.957 に答える
0

行う :

$("#subscriptionSelector").on('change', function() { //alert('#forumSelector');
    var subscriptionIndex = this.value;
    var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);
    $(this).data('checked', subscriptionId); //store as data
    alert(subscriptionId);
});

その後 :

function search () {
    var subscriptionId = $("#subscriptionSelector").data('checked');
    if ($('#deleteyes').prop('checked')) {
        alert(subscriptionId);
    }
}

そうすれば、データは要素に保存されます。

data()jQuery の詳細: http://api.jquery.com/jQuery.data/

于 2012-10-16T13:35:12.257 に答える
0

最善の解決策subscriptionID、 を関数に渡すことsearchです。これが不可能な場合は、より高いスコープ (グローバル スコープなど) にプッシュする必要があります。

グローバルに利用できるようにするには、次のように変更します。

var subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);

これに:

window.subscriptionId = subscriptions[subscriptionIndex]["@metadata"]["@id"].substring(7);

その後、外部の JavaScript でも利用できるようになります。

于 2012-10-16T13:33:53.273 に答える
0

subscriptionId は関数スコープでのみ使用できます

var subscriptionId = "";html ファイル内の $(document) の前に移動

于 2012-10-16T13:33:56.003 に答える
0

交換

<script>
function search ()
{
var subscriptionId = "";

と:

<script>
var subscriptionId = "";
function search ()
{
于 2012-10-16T13:33:58.420 に答える