Javascript类型错误 - 如果先前定义的变量,则不返回函数

时间:2013-04-26 05:41:51

标签: javascript jquery

我有以下测量元素宽度的函数:

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();,我会收到此错误。为什么会这样?

5 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为函数是javascript中的第一类对象。所以:function distanceToCaret(textElement,caretIndex){ ... }与此相同:distanceToCaret = function(textElement,caretIndex){ ... }。也就是说,你可以为一个变量赋一个函数,当你以正常方式定义一个函数时,这只是将它赋给指定变量的快捷方式。

答案 1 :(得分:1)

您正在调用名为distanceToCaret的函数,并将结果分配给distanceToCaret。在JavaScript中,函数并不特殊。变量distanceToCaret包含对函数的引用,因此更改/设置distanceToCaret的值意味着您已丢失对函数的引用。

如果为返回值使用其他名称,则此问题应该消失:

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

答案 2 :(得分:1)

罪魁祸首是

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

将函数distanceToCaret重命名为getDstanceToCaret,然后重命名

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

答案 3 :(得分:1)

您将返回宽度(72)指定给变量distanceToCaret,因此当您调用distanceToCaret函数时,它调用变量而不是函数,因此将变量名称distanceToCaret更改为_distanceToCaret并尝试

答案 4 :(得分:1)

您将使用第一次执行后执行函数的结果覆盖函数定义。

function distanceToCaret(textElement,caretIndex){}

相当于:

var distanceToCaret = function (textElement, caretIndex) {}

所以你执行:

var distanceToCaret = function (textElement, caretIndex) {};
distanceToCaret = distanceToCaret(); // Now distanceToCaret is no longer a function