Что это такое — «понимать замыкания?»
Иногда говорят «Вася молодец, понимает замыкания!». Что это такое — «понимать замыкания», какой смысл обычно вкладывают в эти слова?
«Понимать замыкания» в JavaScript означает понимать следующие вещи:
- Все переменные и параметры функций являются свойствами объекта переменных LexicalEnvironment. Каждый запуск функции создает новый такой объект. На верхнем уровне им является «глобальный объект», в браузере — window.
- При создании функция получает системное свойство [[Scope]], которое ссылается на LexicalEnvironment, в котором она была создана.
- При вызове функции, куда бы её ни передали в коде — она будет искать переменные сначала у себя, а затем во внешних LexicalEnvironment с места своего «рождения».
В нативном Javascript есть метод elem.classList.contains("test-class"), который возвращает true/false в зависимости от того, есть ли класс ("test-class") у элемента (elem) ИЛИ его потомков.
Фундаментальный недостаток [назначения события через on*] — невозможность повесить несколько обработчиков на одно событие.
true != true -> false
true === false -> false
false != true -> true
false === false -> true
"" != true -> true
"" === false -> false
var uploadForm = $('#uploadForm');
$('#userPhotoInput').on('change', function () {
uploadForm.submit();
});
.ymaps-2-1-29-ground-pane
[class*="ymaps-2-1"][class*="-ground-pane"]
.document.getElementByClassName("a")
должно быть document.getElementsByClassName("a")[0]
. Но если таких блоков на странице несколько, то работать этот код корректно не будет. Посмотрите варианты решения вашей задачи здесь.$('span').on('click', function () {
var $el = $(this),
targetID = $el.data('target-id'),
$target = $('#' + targetID);
$target.toggle()
.next('.a')
.toggle();
});
// $(function(){}) и $(document).ready(function(){}) одно и то же
// Нет смысла вкладывать их друг в друга
$(function () {
$(document).ready(function () {
// Если informer может принимать только значения 0 и 1,
// гораздо логичнее сделать эту переменную булевой
var informer = 0;
// Крутые парни ставят точки с запятой в конце выражений
// Конечно, если не хотят потом ловить баги automatic semicolon insertion по ночам
var sfId_Start
var sfId_Target
console.log(informer)
// Зачем у td два обработчика клика?
$('td').click(function () {
init()
++informer;
if (informer > 1) {
informer = 0
}
// if (informer === 1 ) { }
console.log(informer)
});
function init() {
// Зачем делать анонимную функцию, в которой просто вызывается другая функция?
$('td').click(function () {
getId(this);
});
// Зачем эта функция сюда вложена?
function getId(obj) {
var idsf
// Этот код не имеет смысла
// Почему при любом условии в переменную idsf пишется одно и то же значение?
if (informer === 0) {
idsf = $(obj).attr('id')
}
// Зачем проверять, что 1 не равно 0?
if (informer === 1 && informer !== 0) {
idsf = $(obj).attr('id')
}
// Зачем писать одно и то же в обе переменные?
sfId_Start = idsf
sfId_Target = idsf
}
}
})
});
$(".input_has-clear").append("<i class='input__clear'>x</i>");
// Ставим обработчик на событие изменения поля
$('.input__control').on('change', function () {
// Находим родительский блок
$(this).closest('.input_has-clear')
// в родительском блоке находим нужный элемент
.find(".input__clear")
// скрываем или показываем элемент в зависимости от заполненности поля
// обратите внимание, что toggleClass вторым аргументом принимает чисто булевое значение
// поэтому при помощи двойного отрицания приводим строку к нему
// если она пустая - будет false и класс уберется, иначе - добавится
.toggleClass("input__clear_visible", !!$(this).val());
});
$(function() {
$(".input_has-clear").append("<i class='input__clear'>");
// 1. Этот код выполнится один раз при загрузке страницы,
// вам же, наверняка, нужно, чтобы элемент скрывался или показывался
// динамически по мере редактирования поля
// 2. .input_has-clear - это span, у него нет value
if($(".input_has-clear").val() != "") {
// Логика определения скрытия и показа класса неверная
// Если повесить на поле обработчик, то при вводе каждой буквы
// Элемент будет то скрываться, то показываться
$(this).find(".input__clear").toggleClass("input__clear_visible");
}
});
цикл выполняться не хочетВ вашем коде нет ни одного цикла.
function getSomeHtml() {
return $(this).html();
}
for (var p = 0, len = number.length; p < len; p++) {
if (number[p] == 'Свободен') {
number_js[p] = $('.ofice:eq(' + p + ')>.ofice_number>strong').map(getSomeHtml)[0];
for (var i = 0, len = rsrGroups.length; i < len; i++) {
if (number_js[p] == rsrGroups[i].data("room")) {
rsrGroups[i].attr('fill', '#F4DA6C');
}
}
}
}
number_js[p] = $('.ofice:eq(' + p + ')>.ofice_number>strong').first().html();