我不确定为什么我会不断出错。 history.push不是函数

时间:2018-07-30 10:00:26

标签: javascript html

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;
}

我正在尝试将数据推送到历史记录数组中。但是,为什么我总是出错?

2 个答案:

答案 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的简化版本。