Показать сообщение отдельно
  #1 (permalink)  
Старый 10.06.2016, 00:37
Аспирант
Отправить личное сообщение для maxapet Посмотреть профиль Найти все сообщения от maxapet
 
Регистрация: 27.08.2015
Сообщений: 43

Почему не видна переменная?
Имеется такой фрагмент кода jQuery-плагина:
$.fn.colorPicker = function(method){
		var settings;
		var methods = {
			setColor: function(color) {
				if (settings == undefined){
					alert("settings is undefined");
				} else if (settings == null){
					alert("settings is null");
				};
				if (color[0] != "#")
					color = "#" + color;
				this.find(".color-picker-tbl td").each(function(i) {
					if (settings.colors[i] == color) {
						$(this).trigger("click");
					}
				});
				alert();
			},
			init: function(options) {
				return this.each(function(){
					settings = $.extend({}, defaults, options);
					var lineCnt = 2;
					var cellsInLine = settings.colors.length / lineCnt;

					var tbl = $("<table class='color-picker-tbl'/>");
					for(l=0; l < lineCnt; l++){
						var tr = $("<tr />");
						tr.appendTo(tbl);
						for(c=0; c < cellsInLine; c++){
							var td = $("<td style='background-color: " + settings.colors[l * cellsInLine + c] + ";' class='color-picker-mask'></td>").appendTo(tr);
						}
					}
					$(this).append(tbl);
					var $cells = $(this).find(".color-picker-tbl td");
					$cells.each(function(i) {
						$(this).click(function() {
							if (i != settings.selectedColorIdx){
								$cells.eq(settings.selectedColorIdx).removeClass("selected").removeClass("selected-color-mask-1").removeClass("selected-color-mask-2");
								$(this).addClass("selected").addClass(isDark(settings.colors[i]) ? "selected-color-mask-1" : "selected-color-mask-2");
								settings.selectedColorIdx = i;
							}
							settings.click(settings.colors[i]);
						});
					});
					//$cells.eq(settings.selectedColorIdx).trigger("click");
				});
			}
		}
		// немного магии
		if ( methods[method] ) {
			// если запрашиваемый метод существует, мы его вызываем
			// все параметры, кроме имени метода придут в метод
			// this так же перекочует в метод
			return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
		} else if ( typeof method === 'object' || ! method ) {
			// если первым параметром идет объект, либо совсем пусто
			// выполняем метод init
			return methods.init.apply( this, arguments );
		} else {
			// если ничего не получилось
			$.error( 'Метод "' +  method + '" не найден в плагине jQuery.colorPicker' );
		}
   }


Во время работы сначала вызывается функция init, которая, казалось бы, должна инициализировать переменную settings, заданную во второй строке, но этого не происходит. При последующем вызове функции setColor выдаётся сообщение "settings is undefined". Почему? Ведь settings определена во внешней для init и setColor функции, значит, по правилам видимости Javascript, должна быть в них видима и доступна.
Если же задать какое-то начальное значение для settings, то при вызове init оно не меняется. Получается, что при вызове init в строке
settings = $.extend({}, defaults, options);
создаётся новая переменная settings, Но почему?! И как сделать так, чтобы работала именно переменная settings, объявленная во второй строке данного фрагмента?
Ответить с цитированием