Имеется такой фрагмент кода 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, объявленная во второй строке данного фрагмента?