1

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

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

我最初不确定这条线是否有效,但是,根据源代码控制,这条线就在附近,因为该文件是在错误相对较新时创建的。当我调试时,我发现这条线抛出了一个错误,上面写着GetVal1(...) is not a function. 我再次检查以确认包含函数定义的 Javascript 文件,标题如下所示:

function GetVal1(strHTMLId)

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

4

1 回答 1

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

执行以下操作:

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

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

一些想法:

  • 如果new该行之前有一个关键字。然后第一次调用将是构造函数调用。出乎意料的是,构造函数调用会返回一个函数,而非构造函数调用则不会。

  • 如果前一行(或现在)有一个尾随句点,GetVal1则将引用(或现在引用)某个对象的属性。不过,我闻到了违反命名约定的味道,ifGetVal1是一个对象属性。

  • 全局GetVal1被(或最近不再被)同名函数遮蔽。再一次,我闻到了违反命名约定的味道。

  • 最有可能的是,GetVal1它本身已经改变了。当将此字符串作为第一个参数给出时,验证GetVal1可以返回一个函数。

  • 也许绑定到函数的状态GetVal1已经改变(比如说,在代码之前的某个地方又多了一个调用。不过,如果这个函数在每次调用时返回具有相同参数的不同类型的对象,这很可能是一个设计错误。但话又说回来,代码中的某处可能存在设计错误或命名违规。

  • 另一个合理的解释是,这条线从一开始就存在,但以前从未达到过。在这种情况下,它可能一直都是错误的。

于 2013-03-15T16:36:59.990 回答