神秘的Javascript代码行

时间:2013-03-15 15:57:52

标签: javascript web

我正在研究一些使用内部开发的Javascript库的软件中的错误。我正在处理的错误显示在下面一行:

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

我最初不确定这条线是否有效,但是,根据源控制这条线是因为这个文件是在错误相对较新时创建的。当我调试时,我发现这行引发了一个错误GetVal1(...) is not a function。我仔细检查确认包含函数定义的Javascript文件,标题如下所示:

function GetVal1(strHTMLId)

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

1 个答案:

答案 0 :(得分:2)

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

执行以下操作:

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

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

一些想法:

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

  • 如果在上一行(或现在是)上曾经有一个尾随句点,GetVal1会引用(或现在引用)某个对象的属性。但是,如果GetVal1是一个对象属性,我觉得违反了命名约定。

  • 全局GetVal1被(或最近不再被)同名函数遮蔽。再一次,我闻到了违反命名惯例的行为。

  • 最有可能的是,GetVal1本身已发生变化。当将此字符串作为第一个参数时,验证GetVal1可以返回函数。

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

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