常见的调试报错 - 错误: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请求记录),那基本可以断定里面有语法错误,所以没有被执行