[РЕШЕНО] Извлечь функцию из функции 
		
		
		
		Нет больше моих сил. Нужна помощь.  
	Дано функция: 
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
	$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				// smth
			}	
		}
	});
}
Задача: получить функцию $.ajax как объект или строку для последующего внесения изменений. Дополнительное условие: нельзя редактировать первоначальную функцию. Я так понимаю, что единственный способ решить такую головоломку, это взять someFunc как строку и разбить регулярным выражением, отредактировать, а потом собрать обратно. Но у меня упорно не получается написать регулярку для извлечения $.ajax( .. ). Спсибо, что дочитали. Любые идеи приветствуется.  | 
	
		
 Цитата: 
	
 
var str="function someFunc(somevar) { "
str=str+"somevar = typeof(somevar) != 'undefined' ? somevar : 100; "
str=str+"$.ajax({ "
str=str+"url: 'index.php', "
str=str+"type: 'post', "
str=str+"data: 'somevar=' + somevar, "
str=str+"dataType: 'json', "
str=str+"success: function(json) { "
str=str+"// smth "
str=str+"} "
str=str+"} "
str=str+"}); "
str=str+"} "
alert(str.replace(/(\$\.ajax\(\{[\s\S]+\}\);)/gm,'test'));
 | 
	
		
 1.Внутри ajax одна '}' -лишняя 
	2. 
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
	$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				// smth
			//}	
		}
	});
}
var str=someFunc.toString();
alert('$.ajax'+str.split('$.ajax')[1].split('})')[0]+'})');
 | 
	
		
 Спасибо, я со скобочками сам справился) 
	
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
	$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				// smth
			//}	
		}
	});
}
var addToCart_string = addToCart.toString();
addToCart_string = addToCart_string.match(/(\$\.ajax\(\{[\s\S]+\}\);)/gm); 
// теперь у меня есть строка с ajax запросом
// который надо отредактировать
// черещ new Function не получилось и через eval тоже
// по ходу надо распарсить строку и получить параметры
// а потом отъявить
var myNewFunction = $.ajax(params);
Вот тут я сейчас ломаю голову и ищу какой-то готовый инструмент для синтаксического анализа строки.  | 
	
		
 
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
	$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				// smth
			//}	
		}
	});
}
var somevar='somevar';
var str=someFunc.toString();
var pp='var pars='+str.split('$.ajax(')[1].split('})')[0]+'}';eval(pp);for(var u in pars)alert(u+'='+pars[u]);
 | 
	
		
 Почему бы просто не переопределить функцию someFunc? 
	 | 
	
		
 Цитата: 
	
 vadim5june, нетривиально и сыро, но буду разбираться. Спасибо большое.  | 
	
		
 
<html>
<head>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>
<script>
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
	$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				// smth
			//}	
		}
	});
}
var somevar='somevar';
var str=someFunc.toString();
var parameters = 'var pars='+str.split('$.ajax(')[1].split('})')[0]+'}'; eval(parameters);
var paramsArray = {};
	for (var u in pars) {
		if (u && pars && u) {
			paramsArray[u]=pars[u];
		}
	}
	
var my_ajax_funciton_now = $.ajax(someFunc); // это провал. зараза выполняет вместо того, чтобы присваивать.
console.log(my_ajax_funciton_now );
</script>
 
</body>
</html>
 | 
	
		
 Цитата: 
	
 Грамматика JS там в примерах есть, а вот лексем вроде нету. Но найти можно если сильно захотеть.  | 
	
		
 насколько я понимаю нужно изменить значения внутри ajax и переопределить функцию someFuns 
	тогда так 
<!DOCTYPE html>
<head>
 <script 
src="http://code.jquery.com/jquery-1.9.1.js"> 
</script>
</head>
<body>
<script>
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				}
	});
};
var somevar='somevar';
var str=someFunc.toString();
var str0=str.split('$.ajax(')[0];
var stre=')}';
var parameters = 'var pars='+str.split('$.ajax(')[1].split('})')[0]+'}'; eval(parameters);
var paramsArray = {};
	for (var u in pars) {
		if (u && pars && u) {
			paramsArray[u]=pars[u];//здесь переопределяем значения
		}
	}
;	
pp=str0+'$.ajax('+JSON.stringify(paramsArray)+stre;
eval(pp);
console.log(someFunc.toString() );
</script>
 </body>
</html>
 | 
	
		
 Цитата: 
	
 а все остальное ненужые финты ушами 
function foo() {
	alert( 1 );
}
function foo() {
	alert( 2 );
}      
foo();
 | 
	
		
 vadim5june, спасибо, буду разбираться. Не могу пока сказать работает или нет решение. В реальных условиях оно пока ведет себя немного не так как хотелось бы. Проблема в том, что success содержит функцию, а строка не может содержать функцию (я поэтому и пытался сделать через объект). Впрочем, думаю разберусь... В любом случае, большое спасибо за помощь и уроки JS - почерпнул для себя новой информации :) 
	nerv_, представьте, что Вы пишите маленький модуль для большого программного продукта, который регулярно обновляется. И представьте, что функция в которой я хочу изменить 3-4 строки на самом деле состоит из 30-40 строк. Если скопировать всю функцию и переопределить её, то с большой долей возникнет проблема обратной совместимости с новыми версиями. Выложу "конечный" результат - может кому-то будет интересно. 
<!DOCTYPE html>
<head>
<script 
src="http://code.jquery.com/jquery-1.9.1.js"> 
</script>
</head>
<body>
<script>
function someFunc(somevar) {
	somevar = typeof(somevar) != 'undefined' ? somevar : 100;
$.ajax({
		url: 'index.php',
		type: 'post',
		data: 'somevar=' + somevar,
		dataType: 'json',
		success: function(json) {
				}
	});
};
var somevar='somevar';
	
	var str 		= someFunc.toString();
	var str0		= str.split('$.ajax(')[0];
	var stre		= ')';
	var parameters 	= 'var pars=' + str.split('$.ajax(')[1].split('})')[0] + '}'; eval(parameters);
	
	var paramsArray = {};
		for (var u in pars) {
			if (u && pars && u) {
				if (u == 'dataType') {
				
				} 
				else if (u == 'success') {
					paramsArray[u]	= "function() { alert('success!'); }";
				} 
				else if (u == 'url') {
					paramsArray[u]	= pars[u];
				} 
				else if (typeof pars[u] == 'function') { 
					paramsArray[u]	= pars[u].toString();
				} 
				else {
					paramsArray[u]	= pars[u];
				}
			}
		}
		paramsArray['error'] = "function(error) { console.log(error); }"
	
	var pp			= 'alert(100500); $.ajax(' + JSON.stringify(paramsArray) + stre;
	
	str = str.replace(/(\$\.ajax\(\{[\s\S]+\}\);)/gm, pp);
	
	eval(str);
	console.log( someFunc);
	someFunc();
</script>
</body>
</html>
 | 
	
		
 Почему тогда не использовать ajaxSetup, ajaxComplete ? 
	 | 
	
		
 Цитата: 
	
  | 
	
		
 zebra, спасибо, вдохновился у Вас на 
	
$(document).ajaxSend(function(evt, request, settings) {
  console.log("Ajax call on url " + settings.url); // url
  console.log(settings.success); // success function(), но к сожалению это только копия
});
nerv_, из двух зол выбираю. А разработчики в данном случае не "закладывали", а "клали". UPD: Вот ещё интересное варварство.  | 
	
		
 Цитата: 
	
  | 
	
		
 danik.js, js не моя специализация и я мог неправильно выразиться, но: 
	
$(document).ajaxSend(function(event, xhr, options){
    delete options.success;
    console.log(options.success);   // undefined
});
$.ajax({
    url: "test.html",
    success: function() { console.log("Как бы там ни было, а мы увидим этот текст"); }
});
Помощь по проблеме не нужна. Я воспользовался хаком, который привел в предыдущем посте. Всем большое спасибо за интересные комментарии и помощь.  | 
	
		
 Цитата: 
	
  | 
	
		
 Цитата: 
	
 
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
$(document).ajaxSend(function(event, xhr, options){
    alert(options instanceof MyOptions);
    delete options.success;
    console.log(options.success);   // undefined
});
function MyOptions(options) {
    return options;
}
var myOptions = new MyOptions({
    url: "test.html",
    success: function() { console.log("Как бы там ни было, а мы увидим этот текст"); }
});
$.ajax(myOptions);
</script>
 | 
| Часовой пояс GMT +3, время: 16:55. |