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”,第二次调用它我得到错误:

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

事实上,如果disctanceToCaret在我打电话之前完全定义了distanceToCaret = distanceToCaret();我会收到这个错误。为什么会这样?

4

5 回答 5

2

这是因为函数是 javascript 中的一等对象。所以 this: 和 this:function distanceToCaret(textElement,caretIndex){ ... }是一样的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);

将函数重命名distanceToCaretgetDstanceToCaret,然后

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

您正在将返回宽度(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 回答