0

要素の幅を測定する次の関数があります。

function distanceToCaret(textElement,caretIndex){

    line = findLineViaCaret(textElement,caretIndex);
    relativeIndex = caretIndex - line.startIndex;
    textToCaret = line.text.substring(0, relativeIndex);

    hiddenElement = textElement.clone(); //copies font settings and width
    hiddenElement.empty();//clear text
    hiddenElement.css("visibility", "hidden");
    hiddenElement.css("width", "auto"); //so width can be measured
    hiddenElement.css("display", "inline-block"); //so width can be measured

    jQuery('body').append(hiddenElement); // height doesn't exist until inserted into document

    hiddenElement.text(textToCaret); //add character to get height
    width = hiddenElement.width();
    hiddenElement.remove();
    return width;
}

私はそれを次のように呼び出します:

distanceToCaret = distanceToCaret($(this), thisIndex);

この関数を初めて呼び出すと、「72」と返され、2回目に呼び出すとエラーが発生します。

TypeError: '72' is not a function (evaluating 'distanceToCaret($(this), thisIndex)')

実際、disctanceToCaret呼び出す前に定義されている場合distanceToCaret = distanceToCaret();、このエラーが発生します。なぜこうなった?

4

5 に答える 5

2

関数はJavaScriptのファーストクラスオブジェクトであるため、これが発生しています。したがって、 this:function distanceToCaret(textElement,caretIndex){ ... }は this: と同じですdistanceToCaret = function(textElement,caretIndex){ ... }。つまり、関数を変数に割り当てることができます。関数を通常の方法で定義すると、それは指定された変数に割り当てるためのショートカットにすぎません。

于 2013-04-26T05:44:51.697 に答える
1

という名前の関数を呼び出してdistanceToCaret、結果を に代入していdistanceToCaretます。JavaScript では、関数は特別なものではありません。distanceToCaret関数への参照を保持する変数があるため、値を変更/設定distanceToCaretすると、関数への参照が失われます。

戻り値に別の名前を使用すると、この問題は解消されます。

var distance = distanceToCaret($(this), thisIndex);
于 2013-04-26T05:46:16.843 に答える
1

犯人は

distanceToCaret = distanceToCaret($(this), thisIndex);

関数の名前を に変更distanceToCaretしてからgetDstanceToCaret

distanceToCaret = getDstanceToCaret($(this), thisIndex);
于 2013-04-26T05:47:12.607 に答える
1

return width(72) を変数 distanceToCaret に割り当てているため、distanceToCaret 関数を呼び出すと、関数の代わりに変数が呼び出されるため、変数名 distanceToCaret を _distanceToCaret に変更して試してください

于 2013-04-26T05:47:52.263 に答える
1

最初の実行後に関数を実行した結果で関数定義を上書きしています。

function distanceToCaret(textElement,caretIndex){}

以下と同等です。

var distanceToCaret = function (textElement, caretIndex) {}

したがって、次のように実行します。

var distanceToCaret = function (textElement, caretIndex) {};
distanceToCaret = distanceToCaret(); // Now distanceToCaret is no longer a function
于 2013-04-26T05:47:55.373 に答える