Javascript“Uncaught TypeError:object is not a function”关联性问题

代码如下:

<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> 

这将抛出一个“Uncaught TypeError:对象不是一个函数”。 如果我将匿名函数调用/调用包装在另一组圆括号中,它将执行警报,但仍然给我一个错误。 如果我在“var postTypes”定义之后放了一个分号,那么它将完全正常。

我被带到相信JavaScript不需要分号,所以我猜测有一些奇怪的函数应用程序的关联规则,我不完全理解。 我希望有人可以给我答案,为什么我得到这个错误。

谢谢。

JavaScript不需要分号,只是当代码变成语法错误时,解释会将其插入到换行符中。

不幸的是,代码

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

不是一个语法错误,所以没有; 将被插入。 (可以运行的一个例子是

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

为了避免这样的惊喜,训练自己永远结束一个声明;

(*:只是一个拇指规则,并不总是正确的,插入规则要复杂得多,关于分号插入的这个博客页面有更多的细节。

您的代码遇到自动分号插入 (ASI)过程不会发生的情况。

你不应该依赖于ASI,你应该使用分号来正确地分隔语句:

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

你的代码之前,实际上是试图调用数组对象。

我有一个类似的错误,并花了我一段时间才意识到,在我的情况下,我命名数组variablespayInvoices和函数也payInvoices。 它混淆了AngularJs。 一旦我改名为processPayments()它终于工作。 只是想分享这个错误和解决scheme,因为我花了很长时间才弄明白这一点。

尝试在JavaScript文件中的函数调用之前使用函数体。