3

ドキュメント要素をグローバル変数に割り当てて、これらの要素をコードのどこでも使用できるようにしたいと考えています。

私のコード:

// document elements
var drop = null;
var status = null;
var show = null;

function process (drop, status, show) {
    if (document.readyState == 'complete') {
        // init elements
        drop = document.getElementById(drop);
        status = document.getElementById(status);
        show = document.getElementById(show);
    }

    // init event handlers
    drop.addEventListener('drop', handleDrop, false);
}

function handleDrop (evt) {
    // do something
}

問題は、関数 handleDrop でグローバル変数を使用してドキュメント要素で何もできないことですが、関数プロセスではすべてが正常に機能します...

編集:たとえば、関数プロセスでは要素 show (show.innerHTML) のコンテンツを読み取ることができますが、関数 handleDrop では読み取れません。

4

1 に答える 1

3

問題は、関数内のこれらすべてのdrop, status... 変数processがローカル変数であることです。それらは、以前に定義された変数ではなく、その引数を参照します。

これらが最も外側のレベル (つまり、関数の本体内ではない) で定義されている場合、次のようにアクセス (および変更) できます。

window.drop = document.getElementById(drop);
window.status = document.getElementById(status);
window.show = document.getElementById(show);

しかし、実際には別の方法をお勧めします: params と 'closed-over' 変数に別々の名前を使用します。このような:

function process(dropId, statusId, showId) {
    if (document.readyState == 'complete') {
        // init elements
        drop = document.getElementById(dropId);
        status = document.getElementById(statusId);
        show = document.getElementById(showId);
    }
}

どちらの方法でも、handleDrop関数内でこれらの変数に対処できます。選択するスコープに制限がないため、後者の方が明らかに優れています。

于 2012-10-22T18:23:40.330 に答える