///第一个函数 
function chat_say(){
var xmlHttp = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
var msg = document.getElementById('msg').value;
document.getElementById('msg').value = '';
msg = encodeURI(msg);
xmlHttp.onreadystatechange = function() {return chat_doHttpReadyStateChange.call(xmlHttp, xmlHttp)}; 
xmlHttp.open("GET", "./home/chat.php?msgto="+encodeURI(msgto)+"&say="+msg, true); 
xmlHttp.send(null); 
}///chat_doHttpReadyStateChange函数
function chat_doHttpReadyStateChange(xmlHttp) { 
  if(xmlHttp.readyState == 4 && xmlHttp.status == 200) {
  var msgcontent = __trim(xmlHttp.responseText);
  if(msgcontent != ''){
var msglist = msgcontent.split('<sp>');
chat_write_msg('chat_area',msglist[0]);
chat_write_msg('chat_area',msglist[1]);
chat_write_msg('chat_area',msglist[2]);
chat_write_msg('chat_area',msglist[3]);
  }
  } 
}问:为什么在chat_say中为么使用chat_doHttpReadyStateChange.call(xmlHttp, xmlHttp)?这里的call是怎么回事??

解决方案 »

  1.   

    js的继承机制
    <script>
    var obj = {
      name:'i am obj'
    };
    var func = function(arg){
    alert(this.name+" "+arg)
    }
    func.call(obj," :D ");
    <script>
      

  2.   

    call 方法
    调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数
    thisObj可选项。将被用作当前对象的对象。arg1, arg2,  , argN可选项。将被传递方法参数序列。说明
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
      

  3.   

    还是不太明白,CALL相当于一个关键字,那么你不是就把OBJ传到 FUNC里吗?那为什么会多出”D“
      

  4.   

    还是不太明白,CALL相当于一个关键字,那么你不是就把OBJ传到 FUNC里吗?那为什么会多出”D“
    =============
    是':D',呵呵,这个是参数。
    这样会不会更明白点。
    =================
    <script>
    var obj = {
      name:'i am obj'
    };
    var func = function(arg1,arg2,arg3){
    alert(this.name+" "+arg1+arg2+arg3)
    }
    func.call(obj," 参数1 "," 参数2 "," 参数3 ");
    //func.appy(obj,[" 参数1 "," 参数2 "," 参数3 "])//这个也行
    <script>