Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Через argument.callee не получается переписать функцию. (https://javascript.ru/forum/misc/16022-cherez-argument-callee-ne-poluchaetsya-perepisat-funkciyu.html)

Jurasmi 23.03.2011 11:29

Через argument.callee не получается переписать функцию.
 
var myObj = {
	doAction: function(){
		this.makeHTMLRequest(query, doSmth);
	},

	makeXMLRequest: function(query, callback){
		var   that = this,
			callee = arguments.callee;
		$.ajax({ 
			success: function(){
				//override original method "makeXMLRequest"
				callee = function(query, callback){		//не работает, а с "that.makeXMLRequest" работает
					callback();
				};
			}
		});
	}
}


Почему нельзя переписать метод "makeXMLRequest" через "callee", а через "that.makeXMLRequest" - можно?

А вообще задача - не вызывать каждый раз асинхронный запрос, а получить один раз данные, а при следующем вызове брать уже полученные и подставлять их.

B@rmaley.e><e 23.03.2011 12:33

1. В Вашем случае Вы просто изменяете значение переменной callee. С какой стати должен измениться that.makeXMLRequest - непонятно.

2. Даже написав arguments.callee Вы ничего не измените - просто свойство callee объекта arguments будет указывать не на that.makeXMLRequest, а на новую функцию.

3. А вот написав that.makeXMLRequest все сработает так, как нужно. Так как that ссылается именно на тот объект, который Вам нужен, то и свойство будет перезаписано для этого объекта (При этом самой замены функции формально не произойдет, изменится лишь ссылка на нее).

SV0L0CH 23.03.2011 12:54

Идея ясна, приблизительно будет так:
myObj.makeXMLRequest=(function(){
  var callee=function(query,callback){
    $.ajax({success:function(){
      callee=function(query,callback){callback();}
    }});
  }
  return function(){return callee.apply(this, arguments.callee);};
})();


Часовой пояс GMT +3, время: 17:17.