常见的调试报错 - 错误:xxx is not a function

  • 作者:KK

  • 发表日期:2016.11.09


这种错误偶尔会出现,就是项目本来跑得好好的,但突然某天出问题的时候,发现报错内容大概就是xxx is not a function

翻译成中文就是:xxx 不是一个函数


查找错误代码位置

知道了中文含义其实就简单多了,既然说它不是一个函数,通常就是因为有某个地方调用了它,一般调用语法基本就是xxx()了,所以要找它的话,一般在文件里搜索xxx()这块代码就行

但是现在的浏览器很强大了,一般会在报错后面有文件名和行号,点一下就会跳过去

然而有时候文件是被压缩成了一行,并且变量名称是混淆成a b c这些的,所以就算跳到那块源代码也不好阅读,这些情况下,咱们还是要回到开发源代码上去查找文件呢~


分析1:脚本可能未被加载

以前是运行正常的,后来运行不正常,可以这么假定:后来有某些条件导致了这个函数没有产生

回到函数加载的基础知识上可以了解到,如果用function关键字语法一般是会被提前加载的,我们可以先通过function xxx这样的关键词搜索一下定义点在哪里,确认它是否那样定义的

如果是的话,则意味着:script脚本一旦被引入到浏览器,这个function必然是存在的,而错误提示又说not a function,我们可以打包票认为浏览器压根没加载这个script,不信的话可以在该script区域的顶部alert一下,重新运行页面肯定没有提示


分析2:可能外面包了些条件

如果不是通过function关键字定义的函数,那就是赋值定义的,函数本来有的,突然说没有了,那意味着这个赋值语句没有被执行,被一些条件判断因素阻碍了,比如下面这样的代码:

jQuery.ajax = function(){};
};

jQuery.ajax();

后来代码变成了这样:

if(xxx){
	jQuery.ajax = function(){};
}

jQuery.ajax();

后果很明显,这是用最精简的代码来表达的,而实际上的代码情况往往比这个大量许多而且更加复杂一点


分析3:定义函数的地方有语法错误

大前提:使用了function关键字来定义函数,而不是赋值定义

有A B C 三个script标签,其中B是定义了b函数的在C区调用b()时报错说b is not a function

如果确认脚本已经被加载(Network有成功的JS请求记录),那基本可以断定里面有语法错误,所以没有被执行