Ukio_G
@Ukio_G
Незамысловатый юноша.

По какой причине внутри jQuery блока не обновляется значение переменной?

Доброго времени суток.

Столкнулся с непонятным поведением jQuery.
Есть некоторая переменная, которая объявлена, но не проинициализирована в момент объявления.
Далее следует jQuery код, внутри которого с этой переменной происходят различные преобразования.
Однако, вне блока jQuery, эти изменения странным образом теряются.

Код:

function galleryHelper(){
	self.galleryID="works-gallery";
	this.self = this;
	self.rowClass = "line-works-gallery";
	this.createRow = function(){
		var row;                                     // Момент инициализации
		jQuery(function($){
			row = $(document.createElement('div')); // Что-то с этой переменной делаем
			row.addClass(self.rowClass);
			$(row).appendTo("#"+galleryID); 
			row = $(row).get(0);
		});
console.log(row); // undefined
		return row;
	}
}


Я пробовал различные варианты:

function galleryHelper(){
	self.galleryID="works-gallery";
	this.self = this;
	self.rowClass = "line-works-gallery";
	this.createRow = function(){
		var row = jQuery(function($){
			row = $(document.createElement('div'));
			row.addClass(self.rowClass);
			$(row).appendTo("#"+galleryID); 
			row = $(row).get(0);
		});
console.log(row); // document
		return row;
	}
}


И такое тоже находил на SO:

function galleryHelper(){
	self.galleryID="works-gallery";
	this.self = this;
	self.rowClass = "line-works-gallery";
	this.createRow = function(){
		var row;                                     // Момент инициализации
		jQuery(function($){
			row = $(document.createElement('div')); // Что-то с этой переменной делаем
			row.addClass(self.rowClass);
			$(row).appendTo("#"+galleryID); 
			row = $(row).html();
		});
console.log(row); // undefined
		return row;
	}
}


Однако, чтобы ни происходило с row внутри jQuery блока - несмотря на то, что объявлена переменная во внешней области видимости (по отношению к jQuery блоку), эти изменения с ней не происходят.

Я понимаю, что, скорее всего, есть некоторый хитрый и интересный механизм, на основе которого либо работает jQuery, либо он этот механизм и реализует в самом себе.

Очень хотелось бы разобраться в таком загадочном поведении, заранее благодарю за ваши ответы.
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
Robur
@Robur
Знаю больше чем это необходимо
Никита Савиных, все что внутри
jQuery(function($){
    // Внутри вложенного блока что-то делаем с этой переменной
  }

выполнится когда-то в будущем, когда страница загрузится.
у вас сначала переменная объявляется, потом выводится в консоль (undefined) потом через какое-то время страница загружается и вызывается тот код где вы что-то с ним делаете.
поставьте console.log в jquery () и увидите порядок, а так же прочитайте https://api.jquery.com/ready/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
На чёткий вопрос - чёткий ответ.
А при чём здесь jQuery? Переменная объявлена локально, то есть внутри функции, а значит будет уничтожена по её завершении.
function func() {
  var row;
  row = 123;
}
func();
console.log(row); // undefined

https://learn.javascript.ru/closures
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы