programming значения – this, он же контекст функции, // эквивалентно arr.push(3, 4) и arguments. add(4); Метод Function.prototype.call может принимать любое количество аргумен- console.log(arr); тов. Первый из них будет использоваться // ссылается на [1, 2, 3, 3, 4] как this, а оставшиеся будут переданы вызываемой функции как аргументы. Область видимости и this В следующем случае this будет неизменArray.prototype.slice.call([1, 2, ным в разных областях видимости. Это 3], 1, 2) исключение в правиле и оно часто приво// ссылается на [2] дит к ошибкам среди начинающих разработчиков. Метод Function.prototype.apply очень function scoping () { console.log(this); похож на предыдущий, только аргументы в нем передаются одним массивом, вместо неопределенного количеств аргуменreturn function () { console.log(this); тов, как в методе call. String.prototype.split. apply('13.12.02', ['.'])
}; }
// ссылается на ['13', '12', '02'] scoping()();
Метод Function.prototype.bind возвращает специальную функцию, которая, в свою очередь, может быть использована для вызова еще одной функции. От ее имени и будет вызван bind. Функция всегда будет использовать переданный ей this, и в тоже время, ей можно передать несколько аргументов, в качестве всегда используемых в возвращаемой функции. Это может быть очень удобно для каррирования оригинальной функции. var arr = [1, 2]; var add = Array.prototype.push. bind(arr, 3);
// эквивалентно arr.push(3) add();
ualinux.com
// ссылается на Window Распространенный способ обойти создавшуюся проблему – это создать локальную переменную, содержащую ссылку на this в текущей функции, а значит, и в ее области видимости. Она останется доступной во вложенной функции. Вложенная функция, в свою очередь, будет иметь свою собственную переменную this, что означает невозможность использования this родительской функции напрямую. function retaining () { var self = this; return function () { console.log(self); };
Mo r e Than USER v14.05(9)
39