var rels = [
['#b1', '.isk'],
['#b2', '.cat-all']
];
$(document).ready(function() {
var loop = function loop(i) {
var btn = rels[i][0];
var block = rels[i][1];
$(btn).click(function () {
$(block).toggle('slow');
});
};
for (var i = 0; i < rels.length; i++) {
loop(i);
}
$(document).click(function(event) {
for (var i = 0; i < rels.length; i++) {
var btn = rels[i][0];
var block = rels[i][1];
var $btn = $(btn);
var $block = $(block);
if (
$btn.is(event.target) ||
$block.is(event.target) ||
$btn.has(event.target).length ||
$block.has(event.target).length
) continue;
$block.slideUp('slow');
}
});
});
var rels = [
['#b1', '.isk'],
['#b2', '.cat-all']
];
$(document).ready(function() {
for (let i = 0; i < rels.length; i++) {
const [btn, block] = rels[i];
$(btn).click(function () {
$(block).toggle('slow');
});
}
$(document).on("click", function(event) {
for (let i = 0; i < rels.length; i++) {
const [btn, block] = rels[i];
const $btn = $(btn);
const $block = $(block);
if (
$btn.is(event.target) ||
$block.is(event.target) ||
$btn.has(event.target).length ||
$block.has(event.target).length
) continue;
$block.slideUp('slow');
}
});
});
function mat2_from_mat3(input, exclude_x, exclude_y) {
let out = [
0, 0,
0, 0
];
for (let x = 0; x < 2; x++) {
for (let y = 0; y < 2; y++) {
let xInput = (x < exclude_x) ? x : x + 1;
let yInput = (y < exclude_y) ? y : y + 1;
out[y * 2 + x] = input[yInput * 3 + xInput];
}
}
return out;
}
let myMatrix3x3 = [
11, 12, 13,
21, 22, 23,
31, 32, 33
];
mat2_from_mat3(myMatrix3x3, 0, 1);
// [
// 12, 13,
// 32, 33
// ]
var objA = {
a: '1',
fn: function () { console.log(this); }
}
objA.fn() // this === objA
// пример смены контекста
var objB = {
b: '2'
}
objB.fn = objA.fn;
objB.fn() // this === objB
// пример потери контекста
var fn = objA.fn;
fn() // this === window или undefined
// собственная реализация call
Function.prototype.myCall = function(newThis, ...args) {
// метод call работает так:
// fn.call(newThis, arg1, arg2, и тд.)
// вызовет функцию с новымКонтекстом и аргументами
const fn = this;
// особый случай, если newThis нету, тогда
if (newThis === undefined) {
// проверяем strict mode
const isStrict = (function() { return !this; })();
if (isStrict) {
// в строгом просто выполним функцию без конткста
return fn(...args);
}
// в нестрогом режиме контекст установим как window
newThis = window;
}
// если не знаешь что такое Symbol
// то подставь вместо него Math.random()
// key = 'название ключа, которого ещё нет в объекте';
const key = Symbol();
// записываем функцию в поле объекта
newThis[key] = fn;
// и вызываем её
// результат = новыйКонтекст.нашаФункция(аргумент1, арг2, и тд)
const result = newThis[key](...args);
// удаляем ключ, чтобы вернуть объект в изначальный вид
delete newThis[key];
// возвратим результат
return result;
};
// тест для myCall
var getSum = function(b, c) {
return this.a + b + c;
};
console.log(getSum.call({a: 1}, 2, 3) === 6); // true
console.log(getSum.myCall({a: 1}, 2, 3) === 6); // true
// собственная реализация bind
Function.prototype.myBind = function(newThis, ...firstArgs) {
// bind возвращащает новую функцию, которая
// вызовет функцию с новымКонтекстом и аргументами
const fn = this;
return function (...secondArgs) {
return fn.myCall(newThis, ...firstArgs, ...secondArgs);
};
};
// тест для myBind
var obj = {a: 1};
var boundGetSum = getSum.bind(obj, 2);
var myBoundGetSum = getSum.myBind(obj, 2);
console.log(boundGetSum(3) === 6); // true
console.log(myBoundGetSum(3) === 6); // true