1

これは、この問題を説明する必要があると思われるすべてのコードの断片です。マウスダウンがアクティブになったときに連続アクションをオフにしようとしていますが、エラーが発生しています:

Uncaught ReferenceError: e が定義されていません (無名関数)

このエラーは、 findClick(e) を引用符で囲んだ beginAction 関数に起因していると確信しています。どういうわけか、ここで e が正しく渡されているとは思いません。

function Cell(row, column) {
    this.row = row;
    this.column = column;
    }

function foo(bar) {
    //do stuff here
    gCanvas.addEventListener("mousedown", beginAction, false);
    document.addEventListener("mouseup", endAction, false);
    }

function beginAction(e) {
    findClick(e);
    var findClick_timeout = setInterval("findClick(e)", 50);
    }

function endAction(e) {
    if (typeof(findClick_timeout) != "undefined"){ clearTimeout(findClick_timeout);}
    }

function getCursorPosition(e) {
    //finds the cell position here... works
    var cell = new Cell(Math.floor(y/cellSize), Math.floor(x/cellSize));
    return cell;
    }

function findClick(e) { 
    var cell = getCursorPosition(e);
    //do stuff with the cell!!!!!!
    }
4

1 に答える 1

2

タイマー文字列は、グローバル スコープの関数に変換されます。そのため、それらを使用しないでください:

var findClick_timeout = setInterval(function() { findClick(e); }, 50);

このようにして、その小さな匿名関数は、それが作成された「beginAction」関数から「e」にアクセスできます。しかし、文字列だけを渡すと、ランタイムはそれをグローバル スコープで評価し、「e」はありません。そこに。

新しいブラウザには、これに使用できる「バインド」と呼ばれる機能があります。

var findClick_timeout = setInterval(findClick.bind(this, e), 50);

これは、本質的に無名関数が行うことを行うための単なるツールです。

于 2012-07-21T20:43:56.993 に答える