现在的位置: 首页 > 综合 > 正文

一个分号引发的错误!——undefined is not a function

2013年07月09日 ⁄ 综合 ⁄ 共 780字 ⁄ 字号 评论关闭

JS真是太奇怪了,一个莫名其妙错误的例子!

var callback= function(){ alert(1); } //自执行函数 (function(){ alert(2); })();

这一段简单的代码的执行结果,你一定以为是alert(2),那你就错了。
这段代码居然出现alert(1),然后在chrome中,引发一个错误“undefined is not a function”。。

一开始,我实在是想不懂,
如果把callback 换写成 function callback(){} 就没错误。
这到底是什么原因,这难道是rp出问题了?!

百思不得其解,请教了Feather,他看了一会儿后,发现了我的callback函数结尾没有;号!
我一试,果然是这个原因。JS中的;号好时候可有可无,我一直觉得这应该没关系。结果我这下就撞到墙上去了。
后来,我们探讨了一下,原来,如果没有;号,上面代码会变成

var callback= function(){ alert(1); }(function(){ alert(2); })();

即是,整个匿名函数作为callback函数的参数,callback引用的函数又没有返回值,最后的()将导致callback引用的函数再次执行。所以就触发了错误。
实际代码等同于:

var callback= function(){}()();

我们可以再用代码验证一下。

var callback= function(func){ func(); alert(1); }(function(){ alert(2); })();

这样,func为传入函数的参数,将是第二个function,这个结果就变成alert(2)后,再alert(1),然后再引发错误。
根本原因,都是太依赖JS自动插入分号的机制造成的,类似的还有:

return { status:true };

还是得老老实实将分号加上去,代码习惯马虎不得!

抱歉!评论已关闭.