var history=[];
function log(p,i,pm,y,m)
{
var details = {
amt:p,
int:i,
paym:pm,
yea:y,
mon:m
};
history.push(details); //error is here. Uncaught TypeError: history.push is not a function
var currDetails = history[history.length-1];
document.getElementById("mydiv").innerHTML += currDetails.amt;
}
我正在尝试将数据推送到历史记录数组中。但是,为什么我总是出错?
答案 0 :(得分:3)
基本上,您正在访问全局窗口属性history
,并且它是只读的。您收到错误消息是因为在该属性上没有实现push()
。尝试使用其他名称,使其与任何global window property不匹配,以从声明的变量中获得预期的行为:
var historyArr=[];
function log(p,i,pm,y,m)
{
var details = {
amt:p,
int:i,
paym:pm,
yea:y,
mon:m
};
historyArr.push(details);
var currDetails = historyArr[historyArr.length-1];
console.log(currDetails)
}
log('a','b','c','d','e');
答案 1 :(得分:1)
global variable history
在浏览器中是预定义的,并且是只读的。
var history=[];
因此静默失败。
history.push
因此失败,因为history
不是数组对象。
将代码包装在IIFE中,这样您就不会尝试在全局范围内创建不需要的变量,这意味着您可以创建一个history
变量,因为您不会覆盖现有变量。 / p>
var log = (function() {
var history = [];
function log(p, i, pm, y, m) {
var details = {
amt: p,
int: i,
paym: pm,
yea: y,
mon: m
};
history.push(details); //error is here. Uncaught TypeError: history.push is not a function
var currDetails = history[history.length - 1];
document.getElementById("mydiv").innerHTML += currDetails.amt;
}
return log;
})();
(这是the revealing module pattern的简化版本。