我有以下测量元素宽度的函数:
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();
,我会收到此错误。为什么会这样?
答案 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