Javascript“未捕获的TypeError:对象不是函数”关联性问题


92

代码如下:

<body>
    <a href="javascript:;" id="test">hello</a>
</body>

<script type="text/javascript">
    document.getElementById("test").addEventListener("click", function () {
      test()
    }, false)
    function test() {
      var postTypes = new Array('hello', 'there')   
      (function() { alert('hello there') })()
    }
</script>

这将引发:

“未捕获的TypeError:对象不是函数”

如果将匿名函数调用/调用包装在另一组括号中,它将执行警报,但仍然会给我一个错误。如果我在“ var postTypes”定义之后加上分号,则完全可以。

我被认为是javascript不需要分号,因此我猜测我没有完全理解函数应用程序中的一些奇怪的关联性规则。为什么会出现此错误?


看起来几乎就像您在尝试同时创建匿名函数和静态函数,并希望其作为一个整体执行一样。如果删除function()会发生什么
brumScouse 2010年

Answers:


85

JavaScript确实需要分号,只是解释器会在可能的情况下在换行符中为您插入分号*

不幸的是,代码

var a = new B(args)(stuff)()

不会导致语法错误,所以没有;将被插入。(可以运行的示例是

var answer = new Function("x", "return x")(function(){return 42;})();

为避免此类意外,请训练自己始终以结束语句;


*这只是一个经验法则,并不总是正确的。插入规则要复杂得多。这个关于分号插入的博客页面有更多详细信息。


13
或者:为避免此类意外,请训练自己编写干净的可读代码(应始终适用)并了解ASI的一般规则……这与“了解” JS中的闭包的工作原理没有什么不同。

18

您的代码遇到没有自动分号插入(ASI)过程的情况。

您绝对不应依赖ASI。您应该使用分号来正确分隔语句:

var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!

(function() { alert('hello there') })();

您的代码实际上是在尝试调用数组对象。


解决该问题的一种方法,但我不能落后于Crockford-club。

1
@pst:让我改,我不是在Crock's俱乐部在所有 :)
基督教C. SALVADO

在那种情况下,我为那些残酷的话表示歉意:(

我确实很喜欢测验。ASI确实确实与icky代码混淆!

8

我遇到了类似的错误,花了一段时间才意识到,在我的案例中,我将数组变量命名为payInvoices,而函数也命名为payInvoices。它使AngularJs感到困惑。一旦将名称更改为processPayments(),它终于可以工作了。我只是想分享这个错误和解决方案,因为我花了很长时间才弄清楚这一点。


同样在这里,我有一个名为的变量alert,正试图调用javascript警报函数,它会说“警报不是函数”。它试图调用alert变量,而不是实际的功能
James111

0

在JavaScript文件中调用函数之前,请先尝试获取函数主体。


0

我遇到了同样的错误,花了一天半的时间来寻找解决方案。Naomi的答案将我引向了所需的解决方案。

我的输入(类型=按钮)具有name与onClick事件调用的函数名称相同的属性。更改属性后,name一切正常。

<input type="button" name="clearEmployer" onClick="clearEmployer();">

变成:

<input type="button" name="clearEmployerBtn" onClick="clearEmployer();">

0

使用WebPack编译和捆绑TS时出现此错误。由于缺少逗号,它被编译export class AppRouterElement extends connect(store, LitElement){....}let Sr = class extends (Object(wr.connect) (fn, vr)) {....}似乎错误的代码。与汇总捆绑在一起时,没有错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.