我正在调查一些使用内部开发的Javascript库的软件中的错误。我正在处理的错误出现在下面的行:

GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + '~' + (bFinal == true ? '1' : '0');


最初我不确定这行是否有效,但是,根据源代码控制,由于此文件是在错误相对较新的情况下创建的,因此此行一直存在。当我调试时,我发现此行引发了一个错误,提示GetVal1(...) is not a function。我仔细检查以确认是否包含具有函数定义的Javascript文件,标题看起来像这样:

function GetVal1(strHTMLId)


所以,我想我的问题是,这行有效的Javascript代码吗?有什么可以告诉您的错误提示吗?谢谢。

最佳答案

GetVal1("dispLetter")(GetVal1("dispLetter").selectedIndex).value + ...


执行以下操作:


用参数GetVal1调用"dispLetter"
再次使用参数GetVal1调用"dispLetter"
检索第二次selectedIndex的返回值的属性GetVal1
用一个参数调用GetVal1的值调用selectedIndex的第一次调用的返回值。这会使您的情况失败,并抱怨该值不可调用。
返回值的value属性已取消引用。字符串连接如下。


换句话说,此代码似乎假设GetVal1("dispLetter")的第一次调用返回一个函数(这是不寻常的),而第二次调用返回的是一个具有属性selectedIndex的对象(这是不寻常的,因为第一次调用返回了a功能)。

一些想法:


如果在该行之前曾经有一个new关键字。然后,第一个调用将是构造函数调用。出乎意料的是,构造函数调用将返回一个函数,而非构造函数调用则不会。
如果在前一行(或现在)上曾经有一个尾随句点,则GetVal1将引用(或现在引用)某个对象的属性。但是,如果GetVal1是要作为对象属性的,我会闻到违反命名约定的情况。
全局GetVal1被(或最近不再被)同名函数遮盖。我再一次闻到违反命名约定的情况。
GetVal1本身很可能已更改。给定此字符串作为第一个参数时,验证GetVal1可以返回函数。
也许绑定到GetVal1函数的状态已更改(例如,在代码之前的某个地方进行了一个额外的调用。但是,如果此函数在每次调用时使用相同的参数返回不同类型的对象,则很可能是设计错误。但是话又说回来,代码中的某处可能存在设计错误或命名冲突。
另一个合理的解释是,这条线从一开始就存在,但以前从未达到过。在这种情况下,可能一直都是错误的。

08-17 13:53