#javascript
#javascript
Вопрос:
Допустим, у вас есть [Скрипка]
function TestMethod() {
var lifespan = "blah";
$.ajax({
url: "http://www.google.com",
success: function (data) {
alert(lifespan);
},
error: function (errorData) {
alert(lifespan);
},
dataType: 'html'
});
}
Почему он все lifespan
еще существует, когда срабатывает обратный вызов? Что еще сохраняется при асинхронных вызовах? Что позволяет этому происходить, есть ли какая-то «среда выполнения», если хотите, в javascript, которая поддерживает код в рабочем состоянии во время процесса? Если да, то когда он узнает, когда начать разрешать элементам памяти умирать?
Комментарии:
1. Это фиксируется в замыкании. Смотрите: javascriptkit.com/javatutors/closures.shtml
Ответ №1:
Javascript имеет область действия функции, а не область действия блока (фигурная скобка), как C, C , C #, PHP и Java.
Вот пример jsFiddle —
Комментарии:
1. 1 Это помогает, отличный вызов на скрипке. Мне нужно не забыть использовать этот сайт в будущем.
2. Я вижу, что на этот ответ поступает много голосов, а не закрытие. Почему? Сообщество говорит, что причиной является «область действия функции», а не закрытие?
Ответ №2:
Вам нужно прочитать о замыканиях javascript. Все переменные в области встроенной функции (независимо от того, объявлены они в родительских функциях или нет) остаются доступными до тех пор, пока не будут выполнены все ссылки на замыкание внутри функции.
Поскольку я изначально был разработчиком C / C , я думаю об этом как о сборке мусора для фреймов стека. Фрейм стека любой функции не удаляется, когда функция завершает выполнение, а скорее, когда все ссылки на нее освобождены. Встроенные / внутренние функции, которые еще не завершены (например, ваши обратные вызовы ajax), содержат ссылки на содержащие фреймы стека и, следовательно, они все еще доступны до тех пор, пока сами эти встроенные функции не будут выполнены, даже если содержащая функция завершила выполнение.
Как только вы это поймете, это будет очень, очень, очень полезная и отличная функция, которой нет в других языках, таких как C / C . Это делает локальные переменные полезными в большем количестве случаев.
Комментарии:
1. 1 Я все еще немного новичок в js, но у меня есть «javascript the good parts» на заказ.
Ответ №3:
Это одна из основ javascript. замыкания (лямбда-функции) наследуют переменные из области, в которой они были определены.
И это помогает преодолеть многие проблемы, связанные с асинхронным языком, основанным на событиях.
function foo() {
var privateMsg = 'blah...';
setTimeout(function(){
alert('private msg: ' privateMsg);
}, 5000);
}