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

时间:2014-06-30 21:37:09

标签: javascript

我在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);

我在哪里犯错?

感谢和问候

汤姆

3 个答案:

答案 0 :(得分:0)

在将其传递给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) {

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下是您可以尝试的一些调查性更改:

1)函数表达式var SetDetailsToHtmlPage=function (details_array)不在函数中,因此它具有全局范围。因为它是一个表达式,所以变量将被提升为#34;这意味着它在被分配给函数之前被声明。因此,请尝试将其声明为函数:function SetDetailsToHtmlPage(details_array)。这将导致函数声明包括函数get&#34; hoisted&#34;与文档就绪事件的范围相同。

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

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