我在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);
我在哪里犯错?
感谢和问候
汤姆
答案 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);
});