gulp.task('watch', function(){
browserSync.init(config);
gulp.watch(path.watch.html, gulp.series('html:build'));
gulp.watch(path.watch.scss, gulp.series('scss:build'));
gulp.watch(path.watch.css, gulp.series('css:build'));
gulp.watch(path.watch.js, gulp.series('js:build'));
gulp.watch(path.watch.images, gulp.series('images:build'));
gulp.watch(path.watch.fonts, gulp.series('fonts:build'));
})
parallel
и series
. То есть в первом случае Вашиtask-и
в потоке выполняются вместе. А в другом случае, сперва выполнится первый task
, потом второй, третий и до конца.build
можно сделать так:gulp.task('build',
gulp.series(
'clean:build',
gulp.parallel(
'html:build',
'css:build',
'js:build',
'images:build',
'fonts:build'
)));
dist
, а потом собирается продакшн. a {
display:inline-block;
text-decoration:none;
border-bottom: 4px solid blue;
}
a {
display:inline-block;
text-decoration:none;
}
a:after {
display:block;
content:'';
width:100%;
height:4px;
background:blue;
margin-top:-4px;
}
1. Для чего замыкание существуют?Для инкапсуляции данных.
2. В каких условиях они создаются?Когда вложенная функция обращается к переменным внешней функции.
// makeCounter - внешняя функция
function makeCounter(initialValue) {
var value = +initialValue || 0;
// counter - внутренняя функция
// она использует переменную value из внешней функции
// что-бы это было возможным, для counter создается замыкание,
// в котором хранится переменная value
// переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
return function counter() {
return value++;
};
}
// у нас 3 экземпляра функции counter
var counter1 = makeCounter();
var counter2 = makeCounter();
var counter3 = makeCounter(100);
// и для каждой есть своя переменная value
console.log(counter1()); // 0
console.log(counter1()); // 1
console.log(counter2()); // 0
console.log(counter1()); // 2
console.log(counter3()); // 100
// а вот получить как-то напрямую переменную value мы не можем
// инкапсуляция нам не дает поломать данные
outline: inset 100px green;
устанавливает этот контур в виде псевдотрехмерной рамки за счёт осветления правой и нижней границ и затемнения левой и верхней относительно указанного цвета. Ширина 100px, цвет зелёный.outline-offset: -125px;
, которое задаёт смещение контура. При положительном значении контур будет расширяться во все стороны. А при отрицательном будет сжиматься внутрь элемента.outline-offset: -125px;
он должен сжаться внутрь элемента на 125px со всех сторон, а спецификация визуально ограничивает сжатие до outline-offset: -50px;
(по 50px внутрь с каждой стороны элемента). То есть контур должен просто сойтись вместе со всех сторон, образуя квадрат в нашем случае и насколько больше не ставь отрицательное значение, больше он сжиматься не должен. Но реализация в браузерах не учитывает это поведение и выдаёт непонятные фигуры, если отрицательное значение слишком большое.Помните, как родители заставляли вас играть на фортепиано или учить стихи?.. Так вот, Абстрактные классы также как и многие родители вовсе и знать не знают зачем ребенку-потомку это будет нужно, и как он это будет использовать, но уверены, что так НАДО! Т.е. такие классы содержат абстрактные методы, которые являют собой объявление метода без самой реализации, как фантик без конфетки, тем самым обязывая потомка, этот метод реализовать. Как и в жизни, где родители нередко перекладывают на детей свои нереализованные мечты…
Вот в такой шутливо-серьезной форме, мы затронули тему абстрактных классов и семейных отношений, как способ понять… и то и другое?.. А если серьезно, то разумеется, в программировании не должно быть случайных методов, и любые методы и свойства являются частью продуманной иерархии классов, которая как генеалогическое дерево, может давать возможности расширять функционал от поколения к поколению. А абстрактные классы, и еще более абстрактные – интерфейсы ( interface — вообще не содержит реализаций ), помогают программисту не потерять, не забыть реализовать общие необходимые для всех потомков умения в жизни, без которых особь умрет, а с ней и приложение.