繁体   English   中英

将函数作为参数传递时,JavaScript“不是函数”错误

[英]JavaScript “ is not a function” error when passing function as argument

我在html标头中有这段代码:

<script src="../scripts/scripts.js"></script> 
<script>

$(document).ready(function() {
   window.LastConnection=null;
   AjaXUpdateDetails(SetDetailsToHtmlPage);
});

</script>

在scripts.js中,我有:

var SetDetailsToHtmlPage=function (details_array){
   window.LastConnection;
   if (window.LastConnection!==null) {
      if (window.LastConnection!==details_array.last_connection) {
         $("#EStatus").val(details_array.status);
      }
   }
};  

function AjaXUpdateDetails(interfaceUpdateFunc){
   var ajaxRequest;  
   if ( (ajaxRequest=getAjaxObject())===false ) return; 

   ajaxRequest.onreadystatechange = function() {
      if(ajaxRequest.readyState == 4) {       
         var data_array =jQuery.parseJSON(ajaxRequest.responseText); 
         interfaceUpdateFunc(data_array);            
      }
   };

   var queryString = "?id=1";
   ajaxRequest.open("GET", "../scripts/AjaXgetDetails.php" + queryString, true);
   ajaxRequest.send(null); 
}

我读了很多有关将函数作为参数传递的信息,并以为我理解了这个主意,但是却不断出错:

TypeError: interfaceUpdateFunc is not a function
interfaceUpdateFunc(data_array);

我在哪里犯错?

谢谢并恭祝安康

汤姆

在将其传递给AjaXUpdateDetails之前,请尝试检查它:

$(document).ready(function() {
   window.LastConnection=null;
   // verify it is defined here
   console.log(SetDetailsToHtmlPage, typeof SetDetailsToHtmlPage)
   AjaXUpdateDetails(SetDetailsToHtmlPage);
});

我怀疑这会告诉您该函数在此时尚未定义(范围问题)。 您可能可以通过更改来修复它:

var SetDetailsToHtmlPage=function (details_array) {

function SetDetailsToHtmlPage(details_array) {

interfaceUpdateFunc是一个参数。 您不能那样打电话。

if (typeof(interfaceUpdateFunc) == "function") {
    interfaceUpdateFunc.apply(this, [data_array]);
}

您可以通过以下方式检查对象是否为函数:

function isFunction(func) {
  return Object.prototype.toString.call(func) == '[object Function]';
}

if (isFunction(interfaceUpdateFunc)) {
    interfaceUpdateFunc.apply(this, [data_array]);
}

您可以尝试以下几个调查性更改:

1)函数表达式var SetDetailsToHtmlPage=function (details_array)不在函数中,因此具有全局作用域。 因为它是一个表达式,所以该变量将被“悬挂”,这意味着在将其分配给函数之前先对其进行声明。 因此,尝试将其声明为一个函数: function SetDetailsToHtmlPage(details_array) 这将导致包含该函数的函数声明在与文档就绪事件相同的作用域中被“吊起”。

2)如果没有效果,请尝试使用jQuery文档事件.load()而不是.ready()来查看是否有效果。

$(document).load(function() {
   window.LastConnection=null;
   AjaXUpdateDetails(SetDetailsToHtmlPage);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM