1

I'm following the W3Schools tutorial on AJAX, and it provides an example of using a JavaScript callback function here (code pasted below):

<html>
<head>
<script type="text/javascript">
var xmlhttp;
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction()
{
loadXMLDoc("ajax_info.txt",function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
    }
  });
}
</script>
</head>
<body>

<div id="myDiv"><h2>Let AJAX change this text</h2></div>
<button type="button" onclick="myFunction()">Change Content</button>

</body>
</html>

What confuses me is how this sets onreadystatechange to run cfunc when triggered, but cfunc isn't defined. All of my (admittedly basic) programming experience says this should cause an error because you can't refer to a variable/function/etc. before defining it (or passing it).

This answer to another StackOverflow question says cfunc is an "anonymous function" defined within another function, but that only confused me more... Am I misunderstanding something fundamental here?

Community
  • 1
  • 1
TCAllen07
  • 1,294
  • 16
  • 27
  • 2
    W3Schools is **the worst place** to begin your journey with JavaScript / AJAX / HTML or anything else. See Mozilla Developer Network instead. And read [w3fools.com](http://w3fools.com) – Tadeck Jan 20 '12 at 23:52
  • Wow, Mozilla Developer Network is a fantastic resource, thanks! – TCAllen07 Jan 21 '12 at 02:06
  • 1
    You are welcome, but I would rather say that W3Schools is a terrible resource and anything accurate is way better than W3Schools. – Tadeck Jan 21 '12 at 02:26

1 Answers1

2

cfunc is assigned a value on this line:

function loadXMLDoc(url,cfunc)

You pass a function when you call that cfunc:

loadXMLDoc("ajax_info.txt",function() /* and the next several lines */

"anonymous function" defined within another function, but that only confused me more… Am I misunderstanding something fundamental here?

Functions are just a type of object. You can pass them just like you can pass Arrays, Objects, Numbers and anything else.

Quentin
  • 914,110
  • 126
  • 1,211
  • 1,335
  • Ah, I see. I mixed up the scope of the function `loadXMLDoc()`. But `cfunc` is only used within that function... Thanks! – TCAllen07 Jan 21 '12 at 02:02