1.Uncaught TypeError: undefined is not a function
情景描述:
function test(){
this.num=1;
};
$(function(){
var test=new test(); // 當這條語句執行時,一開始var test定義為undefined類型,當執行到new test()報錯檢查到test為一個function,語句報錯,此次變量不能使用和function test同名的test名變量,將變量改名為_test或其他
});
2.Uncaught TypeError: Cannot call method 'push' of undefined
情景描述:
test1.js(非實際腳本)
function item(ID,Name)
{
self=this;
self.ID=ID;
self.Name=Name;
}
function s1(){
self=this;
self.testarray1=ko.observableArray();
self.loadtestarray1=function(){
$.getJSON("/api/Stylist", function (data) {
$.each(data, function (index, item) {
self.testarray1.push(new item(item.ID,item.Name);
});
});
}
}
$(function(){
var s1=new s1();
s1.loadtestarray1();
});
test2.js 示例(非實際腳本)
function s2(){
self=this;
self.testarray2=ko.observableArray();
self.loadtestarray2=function(){
$.getJSON("/api/Stylist", function (data) {
$.each(data, function (index, item) {
self.testarray2.push({ ID:item.ID,Name:item.Name});
});
});
}
}
$(function(){
var s2=new s2();
s2.loadtestarray2();
});
在一個頁面中同時飲用了test1.js和test2.js,運行后報錯Uncaught TypeError: Cannot call method 'push' of undefined。
原因分析:單步調試跟蹤self變量值的變化情況,首先s1()函數先運行self賦值給了一個包含testarray1數組的object, 然后s2()
函數運行self賦值給了testarray2數組的object,接着s1.loadtestarray1()函數先執行獲取一組數據,並跳入了Item函數,self此
時變成了Item對象,之后執行完后跳入執行s2.loadtestarray2()函數,此時發現self應該變成了Item對象。self.testarray2已是
undefined類型了,因為Item對象自然不包含testarray2數組,故此時調用self.testarray2.push方法,self.testarray這個undefined
類型為定義push方法,調試器報錯 Uncaught TypeError: Cannot call method 'push' of undefined。
當多個js中假若要以其他變量替換this,應該命名不一樣。,如self1,self2,當然要取個有意義的命名。