Это описывает распространенную ошибку с использованием замыканий в JavaScript.
. Рассмотрим:
function makeCounter()
{
var obj = {counter: 0};
return {
inc: function(){obj.counter ++;},
get: function(){return obj.counter;}
};
}
counter1 = makeCounter();
counter2 = makeCounter();
counter1.inc();
alert(counter1.get()); // returns 1
alert(counter2.get()); // returns 0
Для каждого времени makeCounter
, {counter: 0}
приводит к созданию нового объекта. Кроме того, создается новая копия obj
для ссылки на новый объект. Таким образом, counter1
и counter2
не зависят друг от друга.
Использование замыкания в цикле является сложным.
Рассмотрим:
var counters = [];
function makeCounters(num)
{
for (var i = 0; i < num; i++)
{
var obj = {counter: 0};
counters[i] = {
inc: function(){obj.counter++;},
get: function(){return obj.counter;}
};
}
}
makeCounters(2);
counters[0].inc();
alert(counters[0].get()); // returns 1
alert(counters[1].get()); // returns 1
Обратите внимание, что counters[0]
и counters[1]
независимы не . Фактически, они работают на одном и том же obj
!
Это связано с тем, что есть только одна копия obj
, разделенная на все итерации цикла, возможно, по соображениям производительности. Несмотря на то, что {counter: 0}
создает новый объект на каждой итерации, одна и та же копия obj
будет просто обновляться с ссылкой на самый новый объект.
Решение состоит в использовании другой вспомогательной функции:
function makeHelper(obj)
{
return {
inc: function(){obj.counter++;},
get: function(){return obj.counter;}
};
}
function makeCounters(num)
{
for (var i = 0; i < num; i++)
{
var obj = {counter: 0};
counters[i] = makeHelper(obj);
}
}
Это работает, потому что локальные переменные в области функции напрямую, а также переменные аргументов функции выделяются новыми экземплярами при записи.
Подробное обсуждение см. в JavaScript ловушки закрытия и использование
, используя этот код
Response.Redirect(resp.RedirectUrl, false);
Context.ApplicationInstance.CompleteRequest();
, вы позволяете запускать свой сайт и другой код (остальное на линиях и остальное на событиях жизненного цикла страницы), которые, вероятно, не проверяются (потому что вы верьте, что это не запускается и не перенаправляется) или может иметь некоторые значения, а вы получаете исключения - в коде, который выполняется до фактического перенаправления.
Попробуйте использовать этот код, который остановит дальнейшее выполнение вашей программы
Response.Redirect(resp.RedirectUrl, false);
return;
с тем, что вы получаете исключение ThreadAbortException
, но вам нужно остановить дальнейший запуск вашей программы с контролируемой остановкой.
relative Перенаправить на страницу с помощью endResponse для истинного VS CompleteRequest и защитного потока
Поскольку целевой URL-адрес получен от третьего лица, после сохранения их в базе данных. вы можете использовать «Sever.Transfer» вместо «Response.Redirect».
Response.Redirect может вызвать кругооборот, поэтому будет латентность.
Целевой URL будет обрабатываться другим доменным / веб-сервером, а не с вашего сервера приложений.
Так что Server.Transfer будет лучшим вариантом для этой операции перенаправления.